Обратите внимание, что под аргументом keepdims
в документах для numpy.sum()
в нем говорится:
keepdims : bool, необязательный
Если установлено значение True, уменьшаемые оси остаются в результате как измерения с размером один. С этой опцией результат будет корректно транслироваться относительно входного массива.
Если передано значение по умолчанию, то keepdims не будет передаваться методу sum
подклассов ndarray
, однако будет любое значение, отличное от значения по умолчанию. Если метод подклассов sum
не реализует keepdims, будут вызваны любые исключения.
Итак, здесь говорится, что если вы используете подкласс numpy.ndarray
, вы получите эту ошибку, если соответствующая функция sum
для подкласса не была определена с ним.
Обратите внимание, что в вашей ошибке он ссылается на строку 1812
в numpy/core/fromnumeric.py
. Взгляните на это в контексте фактического numpy
Исходный код 1.12.x:
kwargs = {}
if keepdims is not np._NoValue:
kwargs['keepdims'] = keepdims
if isinstance(a, _gentype):
res = _sum_(a)
if out is not None:
out[...] = res
return out
return res
if type(a) is not mu.ndarray:
try:
sum = a.sum
except AttributeError:
pass
else:
return sum(axis=axis, dtype=dtype, out=out, **kwargs)
return _methods._sum(a, axis=axis, dtype=dtype,
out=out, **kwargs)
Здесь важно отметить две вещи: функция sum
делала разбор вашей переменной keepdims
, поскольку она вытащила ее выше строки 1812
и попыталась поместить ее в другую функцию, так что вы знаете, что ошибка была не той. вы использовали переменную. Другая важная вещь заключается в том, что строка 1812
, в которой вы ошибаетесь, выполняется только if type(a) is not mu.ndarray
, т. е. если вы используете класс, отличный от ndarray
. И это именно то, на что ссылается документация. Если у вас другой класс, им нужно реализовать эту sum
функцию с аргументом keepdims, и если они этого не сделают, это вызовет ошибку.
Другие классы, такие как np.matrix
, например, будут иметь другую функцию суммирования, и кажется, что даже в numpy 1.13.x
, sum
для типов np.matrix
не поддерживает аргумент keepdim
(поскольку в numpy
матрицы всегда двумерные). Например, он отлично работает с np.array
:
>>> import numpy as np
>>> A = np.eye(4)
>>> A
array([[ 1., 0., 0., 0.],
[ 0., 1., 0., 0.],
[ 0., 0., 1., 0.],
[ 0., 0., 0., 1.]])
>>> np.sum(A, axis=1, keepdims=True)
array([[ 1.],
[ 1.],
[ 1.],
[ 1.]])
Но с np.matrix
это не так:
>>> import numpy.matlib
>>> B = np.matlib.eye(4)
>>> np.sum(B, axis=1, keepdims=True)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File ".../numpy/core/fromnumeric.py", line 1832, in sum
return sum(axis=axis, dtype=dtype, out=out, **kwargs)
TypeError: sum() got an unexpected keyword argument 'keepdims'
Но большинство объектов типа массива/матрицы можно легко привести к массиву в numpy
с помощью np.array(<object>)
, и это должно решить проблему для большинства подклассов объектов в numpy
и, вероятно, вашу проблему. Вы также можете просто обернуть результат обратно в np.matrix
, если вам нужно.
>>> B = np.matlib.eye(4)
>>> B = np.array(B)
>>> np.sum(B, axis=1, keepdims=True)
array([[ 1.],
[ 1.],
[ 1.],
[ 1.]])
Однако, если ваш класс объектов является типом np.matrix
, то аргумент keepdims
не имеет смысла. Матрицы всегда двумерные, поэтому функция sum
не будет уменьшать размерность, и поэтому аргумент ничего не сделает. Вот почему он не реализован для матриц.
person
alkasm
schedule
26.09.2017
numpy
docs специально указывает: если метод суммы подклассов не реализует keepdims, будут возбуждены любые исключения. поэтому мне интересно, является ли вашexp_scores
массивом подклассов, который не имеет реализацииkeepdims
. Это работает, еслиexp_scores = np.ones((10, 10))
или что-то еще? - person alkasm   schedule 26.09.2017exp_scores
не является массивом NumPy, как упоминает выше Александр Рейнольдс. Исходный код NumPy показывает, что строка 1812 может быть найдена только в том случае, если она не является обычным типом массива: github.com/numpy/numpy/blob/maintenance/1.12.x/numpy/core/ - person Alex Riley   schedule 26.09.2017type(exp_scores)
? Еслиexp_scores
представляет собой пустую матрицу, а не массив, то естьtype(exp_scores) = <class 'numpy.matrixlib.defmatrix.matrix'>
или аналогичный, вы получите эту ошибку. Если это так, вам, вероятно, не нужно использовать матрицы numpy, и вам следует переключиться на массивы, если нет важной причины этого не делать. Но если вам не хочется переключать свои данные до этого, вы можете просто привести их к массиву в строке перед суммированием. - person alkasm   schedule 26.09.2017keepdims
- person Daniel F   schedule 26.09.2017sum
не уменьшит размерность, поэтомуkeepdims
— бесполезный параметр. - person alkasm   schedule 26.09.2017