假设我有一个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],])
感谢您的帮助。
答案 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]])