2016-06-24 157 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])) 
相关问题