неподдерживаемый тип(ы) операнда для *: '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