Numpy:展平2D阵列的某些列

时间:2016-07-08 01:32:14

标签: python numpy

假设我有一个numpy数组,如下所示

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]])

如何为第1列中的每个唯一元素展平第2列和第3列,如下所示:

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

感谢您的帮助。

3 个答案:

答案 0 :(得分: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]])

答案 1 :(得分: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.]]

答案 2 :(得分: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]])