长期阅读,第一次写作。
我在 google 和 stack overflow 上四处搜索,但并没有真正找到这个问题的一般答案。
我在使用 numpy 1.6.2 的 python 2.7.3 中收到“* 不受支持的操作数类型:‘numpy.ndarray’和‘numpy.float64’”错误。
错误来自于将 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
两者都有效
现在是问题 child :
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
我知道随机函数和数字看起来很奇怪,但从概念上讲这仍然应该有效,因为当它们分别设置为变量时它有效。
为什么会这样?我该如何在一般意义上修复它?
非常感谢! 杰森
最佳答案
我怀疑这里的问题是 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])
如果您确实收到类似 this is the future 的错误,首先要做的是检查要相乘的数组的 dtype
。它是否包含 NumPy 值或 Python 对象?
关于python - * : 'numpy.ndarray' and 'numpy.float64' 不支持的操作数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14408122/