2016-06-24 110 views
5

numpy中是否有任何函數將此數組按第一列分組?按功能是否有任何numpy組?

我無法找到在互聯網上的任何好的答案..

>>> a 
array([[ 1, 275], 
     [ 1, 441], 
     [ 1, 494], 
     [ 1, 593], 
     [ 2, 679], 
     [ 2, 533], 
     [ 2, 686], 
     [ 3, 559], 
     [ 3, 219], 
     [ 3, 455], 
     [ 4, 605], 
     [ 4, 468], 
     [ 4, 692], 
     [ 4, 613]]) 

通緝輸出:

array([[[275, 441, 494, 593]], 
     [[679, 533, 686]], 
     [[559, 219, 455]], 
     [[605, 468, 692, 613]]], dtype=object) 
+0

我想你的意思是一個列表的數組,而不是列表的列表? –

+1

熊貓解決方案呢? – MaxU

回答

3
n = unique(a[:,0]) 
array([ list(a[a[:,0]==i,1]) for i in n]) 

輸出:

array([[275, 441, 494, 593], [679, 533, 686], [559, 219, 455], 
     [605, 468, 692, 613]], dtype=object) 
+1

有完全相同的答案,因爲他希望在[list [a [a [:,0] == i,1])中爲array [[x] for x] in] in' – efirvida

+0

yes,你的解決方案返回他所要求的。但我只是假設他實際上想要一個列表數組而不是一個無用的數組列表,其中包含單個元素 – Gioelelm

+0

哈哈哈,我知道! – efirvida

4

numpy_indexed包(免責聲明:我是其aut hor)旨在填補這個空白。 numpy-indexed中的所有操作都是完全向量化的,並且在創建該庫期間沒有O(n^2)算法受到傷害。

import numpy_indexed as npi 
npi.group_by(a[:, 0]).split(a[:, 1]) 

注意,它通常是更有效的直接計算在這樣的基團(即,GROUP_BY(鍵).mean(值))相關的屬性,而不是首先分裂成一個列表/交錯數組。

0

受Eelco Hoogendoorn圖書館的啓發,但沒有他的圖書館,並且使用數組的第一列始終在增加的事實。

>>> np.split(a[:, 1], np.cumsum(np.unique(a[:, 0], return_counts=True)[1])[:-1]) 
[array([275, 441, 494, 593]), 
array([679, 533, 686]), 
array([559, 219, 455]), 
array([605, 468, 692, 613])] 

我沒有「timeit」但是這可能是實現問題的更快的方法:

  • 沒有python原有的循環
  • 結果列表是numpy的陣列中,如果您需要就這些其他numpy的操作,沒有新的轉換需要
  • 複雜像O(n)的

PS:我寫的類似的行,因爲我需要「分組」的結果np.nonzero:

>>> indexes, values = np.nonzero(...) 
>>> np.split(values, np.cumsum(np.unique(indexes, return_counts=True)[1])) 
相關問題