2016-04-28 172 views
1

鑑於ndarray:獲取特定元素(N,)

A = np.array([np.array([1], dtype='f'), 
       np.array([2, 3], dtype='f'), 
       np.array([4, 5], dtype='f'), 
       np.array([6], dtype='f'), 
       np.array([7, 8, 9], dtype='f')]) 

其作爲顯示:

A 
array([array([ 1.], dtype=float32), array([ 2., 3.], dtype=float32), 
    array([ 4., 5.], dtype=float32), array([ 6.], dtype=float32), 
    array([ 7., 8., 9.], dtype=float32)], dtype=object) 

我試圖創建從所述第一元素的數組爲了向你展示我的意思,下面是創建我想要使用循環的數組的一些代碼。我想盡可能有效地達到同樣的效果,因爲我的數組A很大(約50000個條目),我需要多次執行操作。

B = np.zeros(len(A)) 
for i, val in enumerate(A): 
    B[i] = val[0] 
B 
array([ 1., 2., 4., 6., 7.]) 

回答

0

H ere的方法是將所有元素連接成一個1D數組,然後通過linear-indexing選擇第一個元素。實施應該是這樣的 -

lens = np.array([len(item) for item in A]) 
out = np.concatenate(A)[np.append(0,lens[:-1].cumsum())] 

瓶頸將與拼接的一部分,但如果有小的長度元素的數量巨大,可能被抵消。所以,效率將取決於輸入數組的格式。

+0

謝謝,這是兩個答案中最快的。仍然沒有我想要的那麼快,但肯定比我天真的方法有所改進。 – jmc

+0

@jmc很高興聽到這是對原始方法的改進,真棒! – Divakar

0

我建議將數組的原始的交錯數組到一個單一的屏蔽數組:

B = np.ma.masked_all((len(A), max(map(len, A)))) 

for ii, row in enumerate(A): 
    B[ii,:len(row)] = row 

現在您有:

[[1.0 -- --] 
[2.0 3.0 --] 
[4.0 5.0 --] 
[6.0 -- --] 
[7.0 8.0 9.0]] 

,你可以得到的第一列是這樣的:

B[:,0].data