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

时间:2013-01-18 21:42:47

标签: 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

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

我知道随机函数和数字看起来很奇怪,但从概念上讲,它仍然可以工作,因为当两者都被单独设置为变量时它会起作用。

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

非常感谢! 杰森

2 个答案:

答案 0 :(得分:7)

我怀疑这里的问题是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数组。

修复是为了避免在NumPy数组中创建long值,而是使用float代替:

>>> 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对象?

答案 1 :(得分:0)

这是一个测验吗?我不明白为什么这个问题如此混淆......一切都归结为这个简单的事实。

鉴于

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

我们有

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

这是(或功能,我不知道)的错误,因为它应该是y.__mul__(x) == y.__rmul__(x)(至少对于x和{{1}的这些特定值})。

Python y不知道如何使用long处理乘法(但这是正确的。)

numpy.float64

因此>>> x.__mul__(y) NotImplemented >>> x.__rmul__(y) NotImplemented 评估为y*x并给出预期结果。相反,y.__mul__(x)首先尝试x*y(未实现,确定)而不是x.__mul__(y)(未实现,但是错误。)。

正如已经指出的那样,我们可以拥有y.__rmul__(x)个任意对象,一切都变得清晰。

修改

此错误已得到纠正(可能是numpy版本1.7):

nd.arrays