Python Numpy:展平二维数组的某些列

Python Numpy:展平二维数组的某些列,python,numpy,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],]) 谢谢你的帮助 import numpy as np

假设我有一个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],])
谢谢你的帮助

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

使用列表理解的另一个选项:

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

因为正如在评论中所发布的,我们知道
列-0
中的每个唯一元素都有固定数量的行,我认为这意味着相同数量的行,所以我们可以使用矢量化方法来解决这个问题。我们根据
column-0
对行进行排序,并查找沿着它的移动,这将表示组更改,从而为我们提供
column-0
中每个唯一元素关联的行的确切数量。让我们称之为
L
。最后,我们对排序后的数组进行切片以选择
列-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]])

如果结果行的长度不相同,会发生什么情况?列1中的每个唯一元素都有固定数量的行,因此结果行的长度相同。我怀疑numpy在这种特定情况下是否具有内置函数。不过你可以用熊猫。或者只编写自己的函数。你试过什么吗?