长期读者,第一次作家。
我在谷歌和堆栈溢出搜索,但是真的无法找到这个问题的一般答案。
我使用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
我知道随机函数和数字看起来很奇怪,但从概念上讲,它仍然可以工作,因为当两者都被单独设置为变量时它会起作用。
为什么会这样?如何在一般意义上修复它?
非常感谢! 杰森
答案 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