我想要的是找到2D
NumPy
数组中每列的长度。
如果所有列具有相同的长度,则numpy.shape
这是微不足道的。不过,如果列的长度不同,numpy.shape
实际上并没有告诉我不同列的长度。
a=np.asarray([[0,1],[0,1],[0,1]])
b=np.asarray([[0,1],[0,1,2],[0]])
a.shape,b.shape
((3,2), (3,))
我可以通过做类似的事情来轻松得到我想要的东西,
lenb=[len(B) for B in b]
[2, 3, 1]
但是,我觉得必须有一个更清洁,更快捷的方法来NumPy
吗?
答案 0 :(得分:3)
您的b
是一个对象数组 - 带有列表元素的1d。该阵列上的大多数操作都需要列表理解或映射。
array([[0, 1], [0, 1, 2], [0]], dtype=object)
'object'dtype将数组操作与列表操作分开。 shape
是一个数组属性。 len()
是最接近的列表函数,但它必须分别应用于每个元素。
在Py3中,我更喜欢清晰的列表理解来映射,但这只是一种偏好。在功能上它是一样的:
In [30]: [len(i) for i in b]
Out[30]: [2, 3, 1]
In [31]: list(map(len,b))
Out[31]: [2, 3, 1]
还有另一种可能性:
In [32]: np.frompyfunc(len,1,1)(b)
Out[32]: array([2, 3, 1], dtype=object)
您可以使用b
len
的元素更改为其他对象
In [39]: b[0]='abcd' # string
In [43]: b[2]={1,2,1,3,4} # set
In [44]: b
Out[44]: array(['abcd', [0, 1, 2], {1, 2, 3, 4}], dtype=object)
In [45]: [len(i) for i in b]
Out[45]: [4, 3, 4]
这应该强调len
是元素的属性,而不是数组或它的'列'(它没有)。