由于张贴在评论,我们知道,在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]])
如果会发生什么生成的行不具有相同的长度? – Julien
第1列中的每个唯一元素都有固定的行数,所以生成的行将具有相同的长度。 – Allen
我怀疑numpy会有这样一个特定情况下的内建函数。尽管你可以使用熊猫。或者只写自己的功能。你有尝试过什么吗? – Julien