2013-01-18 86 views
8

長時間讀寫器,第一次寫入。不受支持的操作數類型爲*:'numpy.ndarray'和'numpy.float64'

我搜索了谷歌和堆棧溢出,但沒有真正能夠找到這個問題的一般答案。

我在使用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

我知道隨機函數和數字似乎很奇怪,但這個概念應該還是工作,因爲它的工作當兩個被設置成變量分別。

爲什麼會發生這種情況?我怎樣才能解決它在一般意義上?

非常感謝! Jason

+0

我想你已經陷入了代碼中的錯誤,你可能需要將其報告給numpy的人。爲了記錄,如果'a'是'np.ndarray','x'是'np.float64',那麼'x * a'和'a * x [']'都可以工作,但是沒有一個* x','a + x','a/x'或'a-x'。很難理解爲什麼,如果'a'的__mul__'方法不能處理它,''x'的__rmul__'不會被調用,因爲它似乎知道如何處理這種情況... – Jaime

+0

非常感謝審查我的。我會嘗試在numpy中報告它是一個問題。 您認爲可能有辦法解決這個問題嗎? – Jason

+0

如果你用'x ['''替換''x''它可以工作,但它是一個討厭的破解... – Jaime

回答

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

+0

良好的通話!我的數組變量(y = np.square(np.add(np.divide(np.zeros(100),42),( - 27)** 40))如上面在我的問題中定義的)具有類型'object'( y.dtype) 不幸的是,我不確定我能否強制它成爲一個浮動,考慮到它是從一個浮動開始的,並且沿着某個方向將自己拋到了一個很長的位置。 – Jason

+0

這是'(-27)** 40'的操作問題。 NumPy無法直接處理Python'long'。但是,您可以使用'np.array'將NumPy數組轉換爲另一個不同類型的數組。例如,'np.array(np.array(27 ** 40),dtype = np.float64)'將返回一個'float64'類型的數組。 –

+0

是的,我能夠找到我的代碼中生成的ints 27和40的位置,並將它們轉換爲浮點數。記錄np.arange生成int32。大多數numpy函數都在浮點數中工作,包括np.ones和np.zeros – Jason

-1

這是一個測驗嗎?我不明白爲什麼這個問題如此混淆......一切都歸結爲這個簡單的事實。

鑑於

>>> 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這些特定值和y)。

的Python long不知道如何處理與numpy.float64乘(但這是正確的。)

>>> x.__mul__(y) 
NotImplemented 
>>> x.__rmul__(y) 
NotImplemented 

所以y*x計算結果爲y.__mul__(x)並給出了預期的結果。相反,x*y第一次嘗試爲x.__mul__(y)(未實現,正常),而不是y.__rmul__(x)(未實現但存在錯誤)。如已經指出的,我們可以有任意對象的nd.arrays,並且一切都變得清晰。

編輯

此bug已被修正(可能在numpy的版本1.7):

>>> np.version.version 
'1.13.1' 
>>> x = 10**100 
>>> y = np.float64(1) 
>>> x.__mul__(y) 
NotImplemented 
>>> x.__rmul__(y) 
NotImplemented 
>>> y.__mul__(x) 
1e+100 
>>> y.__rmul__(x) 
1e+100 
>>> x*y 
1e+100 
>>> y*x 
1e+100 
+0

爲什麼會降低這個值? – Worthy7

+0

@ Worthy7不知道爲什麼我的回答是downvoted:恕我直言,它確定負責意想不到的行爲的numpy錯誤,由https://github.com/numpy/numpy/issues/2930#issuecomment-12445232(和不,我在閱讀了這個numpy問題後,我沒有寫出答案。) –

相關問題