*:'numpy.ndarray'和'numpy.float64'不支持的操作数类型

Jas*_*son 8 python numpy operand

长期读者,第一次作家.

我搜索了谷歌和堆栈溢出,但真的无法找到这个问题的一般答案.

我使用numpy 1.6.2在python 2.7.3中获得了*:'numpy.ndarray'和'numpy.float64'"错误的"不支持的操作数类型".

错误来自于将numpy数组和numpy浮点数相乘,但每次都不会发生.

例如:

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

要么

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
Run Code Online (Sandbox Code Playgroud)

两者都有效

现在针对问题儿童:

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

或者,如上所述定义x:

np.multiply(np.square(np.add(np.divide(np.zeros(100),42),(-27)**40)),x)
Run Code Online (Sandbox Code Playgroud)

两者都产生错误:NotImplemented

我知道随机函数和数字看起来很奇怪,但从概念上讲,它仍然可以工作,因为它们都可以单独设置为变量.

为什么会这样?如何在一般意义上修复它?

非常感谢!贾森

Luk*_*ard 7

我怀疑这里的问题是NumPy无法long在其数组中存储Python 值.只要您尝试这样做,它就会将数组的数据类型切换为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'
Run Code Online (Sandbox Code Playgroud)

奇怪的是,交换参数的顺序有时可以工作:

>>> np.tan(1) * np.array(27**40)
2.7986777223711575e+57
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,结果的类型是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])
Run Code Online (Sandbox Code Playgroud)

如果你确实得到了这样的错误,那么首先要做的是检查dtype数组是否相乘.它包含NumPy值还是Python对象?