2017-05-31 37 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的答案。

相关问题