找到具有不同列长度的numpy数组的形状

时间:2017-04-05 18:15:21

标签: python arrays numpy

我想要的是找到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吗?

1 个答案:

答案 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是元素的属性,而不是数组或它的'列'(它没有)。

相关问题