2012-09-25 66 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