2016-07-08 56 views
2

假设我有一个numpy的阵列如下面numpy的:拼合的2 d阵列

a = np.asarray([[1,2,3],[1,4,3],[2,5,4],[2,7,5]]) 

array([[1, 2, 3], 
     [1, 4, 3], 
     [2, 5, 4], 
     [2, 7, 5]]) 

如何可以拼合柱2和3对每个唯一的元素在列1中像下面的一些列:

array([[1, 2, 3, 4, 3], 
     [2, 5, 4, 7, 5],]) 

谢谢你的帮助。

+0

如果会发生什么生成的行不具有相同的长度? – Julien

+0

第1列中的每个唯一元素都有固定的行数,所以生成的行将具有相同的长度。 – Allen

+0

我怀疑numpy会有这样一个特定情况下的内建函数。尽管你可以使用熊猫。或者只写自己的功能。你有尝试过什么吗? – Julien

回答

3

另一种选择使用列表理解:

np.array([np.insert(a[a[:,0] == k, 1:].flatten(), 0, k) for k in np.unique(a[:,0])]) 

# array([[1, 2, 3, 4, 3], 
#  [2, 5, 4, 7, 5]]) 
2
import numpy as np 
a = np.asarray([[1,2,3],[1,4,3],[2,5,4],[2,7,5]]) 
d = {} 
for row in a: 
    d[row[0]] = np.concatenate((d.get(row[0], []), row[1:])) 
r = np.array([np.concatenate(([key], d[key])) for key in d]) 
print(r) 

此打印:

[[ 1. 2. 3. 4. 3.] 
[ 2. 5. 4. 7. 5.]] 
0

由于张贴在评论,我们知道,在column-0每一个独特的元素将有一个固定的数我认为这意味着相同数量的行,我们可以使用矢量化方法来解决这个问题。我们根据column-0对行进行排序,并沿着它排列,这意味着组更改,从而为我们提供了column-0中每个唯一元素关联的确切行数。我们称之为L。最后,我们对已排序的数组进行切片,以通过重塑来选择columns-1,2和组L行。因此,实现起来 -

sa = a[a[:,0].argsort()] 
L = np.unique(sa[:,0],return_index=True)[1][1] 
out = np.column_stack((sa[::L,0],sa[:,1:].reshape(-1,2*L))) 

更多的性能提升,我们可以使用np.diff计算L,像这样 -

L = np.where(np.diff(sa[:,0])>0)[0][0]+1 

采样运行 -

In [103]: a 
Out[103]: 
array([[1, 2, 3], 
     [3, 7, 8], 
     [1, 4, 3], 
     [2, 5, 4], 
     [3, 8, 2], 
     [2, 7, 5]]) 

In [104]: sa = a[a[:,0].argsort()] 
    ...: L = np.unique(sa[:,0],return_index=True)[1][1] 
    ...: out = np.column_stack((sa[::L,0],sa[:,1:].reshape(-1,2*L))) 
    ...: 

In [105]: out 
Out[105]: 
array([[1, 2, 3, 4, 3], 
     [2, 5, 4, 7, 5], 
     [3, 7, 8, 8, 2]])