2017-04-05 154 views
0

我想要的是查找2D numpy數組中每列的長度。查找具有不同列長度的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的做到這一點。

+2

清潔:'map(len,b)'? – Divakar

+3

首先,這些是行。其次,你應該幾乎不會嘗試像這樣創建一個鋸齒狀的NumPy數組。 NumPy不是爲它設計的,索引會中斷,廣播將會中斷,所有的東西和廚房的水槽都會斷開......如果你真的需要使用鋸齒形的數據結構,不要把它作爲一個數組。 – user2357112

回答

2

您的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是一個屬性的事實元素,而不是數組或它的'列'(它沒有)。