2017-05-31 38 views
2

我定義了以下numpy的數組:numpy的陣列司 - 不支持的操作數類型(個),/:「列表」和「浮動」

import numpy as np 
numpy_array = np.array([[-1,-1,-1,-1,-1], [-1,2,2,2,-1], [-1,2,8,2,-1], [-1,2,2,2,-1], [-1,-1,-1,-1,-1,-1]]) 

現在我想通過8到整個陣列劃分:

numpy_array /= np.float(8.0) 

我收到以下錯誤信息:

TypeError: unsupported operand type(s) for /: 'list' and 'float' 

我希望有人對我一個提示,我在做什麼錯。

+1

這看起來不像常規數組。它的每個元素都是一個列表而不是一個數組。 – Divakar

+3

列表中的最後一項是否意味着有6個項目,其他項目只有5個? – njoosse

+0

@njoose你是對的,這是一個錯誤! – Max

回答

3

不幸的是你內心的列表,以便numpy的創建一個對象數組是不一樣的尺寸:

>>> numpy_array 
array([[-1, -1, -1, -1, -1], [-1, 2, 2, 2, -1], [-1, 2, 8, 2, -1], 
     [-1, 2, 2, 2, -1], [-1, -1, -1, -1, -1, -1]], dtype=object) 

你應該儘量避免object的陣列,因爲他們可能不表現得像課程的預期,他們是慢。如果你需要不同大小的內部列表,您應該掩蓋元素:

>>> import numpy as np 
>>> numpy_array = np.array([[-1,-1,-1,-1,-1, np.nan], 
...       [-1, 2, 2, 2,-1, np.nan], 
...       [-1, 2, 8, 2,-1, np.nan], 
...       [-1, 2, 2, 2,-1, np.nan], 
...       [-1,-1,-1,-1,-1,-1]]) 
>>> numpy_array = np.ma.array(numpy_array, mask=np.isnan(numpy_array)) 
>>> numpy_array /= 8.0 
>>> numpy_array 
masked_array(data = 
[[-0.125 -0.125 -0.125 -0.125 -0.125 --] 
[-0.125 0.25 0.25 0.25 -0.125 --] 
[-0.125 0.25 1.0 0.25 -0.125 --] 
[-0.125 0.25 0.25 0.25 -0.125 --] 
[-0.125 -0.125 -0.125 -0.125 -0.125 -0.125]], 
      mask = 
[[False False False False False True] 
[False False False False False True] 
[False False False False False True] 
[False False False False False True] 
[False False False False False False]], 
     fill_value = 1e+20) 

你也需要小心就地-操作,因爲它們不改變dtype,所以當你有一個整數數組和就地與浮動你仍然有一個整數數組(與截斷結果)-divide,或得到一個異常:

>>> arr = np.array([1, 2, 3]) 
>>> arr /= 8.0 
TypeError: ufunc 'true_divide' output (typecode 'd') could not be coerced to provided output parameter (typecode 'l') according to the casting rule ''same_kind'' 

創建float陣列,而不是(或轉換爲float或只是做一個正常的分裂arr = arr/8.0):

>>> arr = np.array([1, 2, 3], dtype=float) 
>>> arr /= 8.0 
>>> arr 
array([ 0.125, 0.25 , 0.375]) 
+0

非常感謝您的詳細解答!其實我犯了一個錯誤,最後一個列表有6個元素,但應該只有5個(感謝njoose指出)。應用你接近的工作! – Max

+0

@Max好吧,我認爲這是故意的。但是,如果這只是一個疏忽,你只需要從最後一個列表中刪除不必要的元素:) – MSeifert

3

該數組有一個不正確大小的列表,最終列表不正確。

如果您想保留數據爲int,您可以使用numpy_array = np.divide(numpy_array, 8.0),否則請參閱MSeifert的答案。

相關問題