неподдерживаемый тип(ы) операнда для *: 'numpy.ndarray' и 'и NumPy.float64'

читатель долгого времени, писатель первого раза.

Я искал в google и Stack overflow, но не смог найти общий ответ на этот вопрос.

Я получаю " неподдерживаемый тип(ы) операнда для *: 'numpy.ndarray' и 'и NumPy.float64 '" ошибка в python 2.7.3 с использованием numpy 1.6.2.

ошибка происходит от умножения массива numpy и NumPy float, но это происходит не каждый раз.

для пример:

x = np.tan(1) # numpy.float64
y = np.array([0,1,2,3]) # numpy.ndarray
np.multiply(x,y) # works no problem

или

x = np.tan(np.abs(np.multiply(-31,41)))  # numpy.float64
y = np.square(np.add(np.divide(np.zeros(100),42),(-27)**40)) # numpy.ndarray
np.multiply(x,y) # works no problem

работы

теперь для проблемных детей:

np.multiply(np.square(np.add(np.divide(np.zeros(100),42),-27)**40)),
np.tan(np.abs(np.multiply(-31,41))))

или, с x, определенным как выше:

np.multiply(np.square(np.add(np.divide(np.zeros(100),42),(-27)**40)),x)

оба производят ошибку: NotImplemented

Я знаю, что случайные функции и числа кажутся нечетными, но концептуально это все равно должно работать, так как это работало, когда оба были установлены на переменные по отдельности.

Почему это происходит? Как я могу исправить это в общем смысл?

спасибо! Джейсон!--5-->

2 ответов


Я подозреваю, что проблема здесь в том, что NumPy не может хранить Python long значений в массивы. Как только вы попытаетесь это сделать, он переключает тип данных массива на object. Арифметические операции над массивом становятся сложнее, потому что NumPy больше не может выполнять саму арифметику.

>>> np.array(27**40)
array(1797010299914431210413179829509605039731475627537851106401L, dtype=object)
>>> np.array(27**40) * np.tan(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for *: 'numpy.ndarray' and 'numpy.float64'

как ни странно, замена порядка аргументов иногда может работать:

>>> np.tan(1) * np.array(27**40)
2.7986777223711575e+57

в этом втором случае тип результата-Python float, не в массив NumPy.

исправление во избежание создания long значения в массивах NumPy и использовать float s вместо:

>>> np.array(27.0**40)
array(1.797010299914431e+57)
>>> np.array(27.0**40) * np.tan(1)
2.7986777223711575e+57
>>> np.multiply(np.square(np.add(np.divide(np.zeros(10),42),(-27.0)**40)),np.tan(1))
array([  5.02925269e+114,   5.02925269e+114,   5.02925269e+114,
         5.02925269e+114,   5.02925269e+114,   5.02925269e+114,
         5.02925269e+114,   5.02925269e+114,   5.02925269e+114,
         5.02925269e+114])

если вы получаете ошибку, как это будущее, первое, что нужно сделать, это проверить dtype умножаемого массива. Содержит ли он значения NumPy или объекты Python?


это загадка? Я не понимаю, почему этот вопрос так запутан... Все сводится к этому простому факту.

дано

>>> x = 10**100
>>> type(x)
<type 'long'>
>>> y = np.float64(1)

у нас есть

>>> y.__mul__(x)
1e+100
>>> y.__rmul__(x)
NotImplemented

это ошибка (или особенность, не знаю) так как он должен быть!--4--> (по крайней мере для этих конкретных значений x и y).

Python long не знает, как обрабатывать умножение с numpy.float64 (но это правильный.)

>>> x.__mul__(y)
NotImplemented
>>> x.__rmul__(y)
NotImplemented

так y*x оценивает в y.__mul__(x) и дает ожидаемый результат. Наоборот!--11--> сначала пытался как x.__mul__(y) (не реализовано, ОК), чем как y.__rmul__(x) (не выполнены, но ошибка.).

как уже отмечалось, мы можем иметь nd.arrays произвольных объектов, и все становится ясно.

редактировать

эта ошибка была исправлена (вероятно, в numpy ver. 1.7):

>>> np.version.version
'1.13.1'
>>> x = 10**100
>>> y = np.float64(1)
>>> x.__mul__(y)
NotImplemented
>>> x.__rmul__(y)
NotImplemented
>>> y.__mul__(x)
1e+100
>>> y.__rmul__(x)
1e+100
>>> x*y
1e+100
>>> y*x
1e+100