2012-09-25 38 views
9

如果我运行下面的代码:如果我改变b += cb = b + c,代码运行正常在numpy数组上使用就地操作时生成的TypeError?

TypeError: ufunc 'add' output (typecode 'O') could not be coerced to provided 
output parameter (typecode 'd') according to the casting rule ''same_kind'' 

import numpy as np 

b = np.zeros(1) 
c = np.zeros(1) 
c = c/2**63 

print b, c 
b += c 

我收到此错误信息。为什么这样?我在RHEL上运行Python 2.7.2。

NumPy的版本:2.0.0.dev-a2a9dfb

GCC版本:4.1.2 20080704(红帽4.1.2-52)

预先感谢您。

+2

请发布您的numpy版本('print np.version.version')和'gcc --version'(来自shell),因为我们需要bug报告的信息。 –

+1

我同样有'/ ='这个问题。感谢您解决它的后。 –

回答

9

当你这样做c=c/2**63c被强制转换为dtype=object(这就是问题所在),而b住宿与dtype=float

当您将dtype=object阵列添加到dtype=float时,结果为dtype=object阵列。把它看作dtype的优先顺序,就像在一个numpy int中添加一个numpy的浮点数给出一个numpy的浮点数一样。

如果您尝试将object添加到float到位,它失败了,因为结果不能投从objectfloat。正如您可能已经注意到的,当您使用像b=b+c这样的基本添加时,结果b将转换为dtype=object

请注意,使用c=c/2.**63c保留为浮点数,并且b+=c按预期工作。请注意,如果cnp.ones(1)你也不会有问题。

总之:(np.array([0], dtype=float)/2**63)).dtype == np.dtype(object)可能是一个错误。

+0

我不确定这是一个错误。也许 - 但是'2 ** 63'大于'int64'的最大值,所以我不确定'numpy'除了将它存储在一个Python对象数组之外是否有意义。 – senderle

+0

除“long”优先级低于“float”优先级外。 –

+0

是的,无论如何我甚至无法重现OPs问题。 – senderle