将行插入NumPy数组

时间:2016-05-14 13:29:01

标签: python arrays sorting numpy

我有:

A = np.array([[0,1,1],[0,3,2],[1,1,1],[1,5,2]])

其中NumPy数组基于第一个元素排序,然后是第二个元素,依此类推。

我想将[1,4,10]插入A,以便输出为:

A = array([[0,1,1],[0,3,2],[1,1,1],[1,4,10][1,5,2]])                 

我该怎么做?

1 个答案:

答案 0 :(得分:2)

首先,将新的1D数组堆叠为np.vstack -

的最后一行
B = np.vstack((A,[1,4,10]))

现在,为了保持每行考虑第一个然后第二个等等的优先顺序,假设每一行作为索引元组,然后获得已排序的索引。这可以通过np.ravel_multi_index(B.T,B.max(0)+1)来实现。然后,使用这些索引重新排列B行并具有所需的输出。因此,最终的代码是 -

out = B[np.ravel_multi_index(B.T,B.max(0)+1).argsort()]

似乎有np.lexsort的替代方法可以获得尊重该优先级的排序索引,但是从相反的意义上来说。因此,我们需要逐行反转元素的顺序,使用lexsort然后获取已排序的索引。然后可以将这些索引用于索引到B,就像在前一种方法中一样,并获得输出。因此,np.lexsort的替代最终代码将是 -

out = B[np.lexsort(B[:,::-1].T)]

示例运行 -

In [60]: A
Out[60]: 
array([[0, 1, 1],
       [0, 3, 2],
       [1, 1, 1],
       [1, 5, 2]])

In [61]: B = np.vstack((A,[1,4,10]))

In [62]: B
Out[62]: 
array([[ 0,  1,  1],
       [ 0,  3,  2],
       [ 1,  1,  1],
       [ 1,  5,  2],
       [ 1,  4, 10]])  # <= New row

In [63]: B[np.ravel_multi_index(B.T,B.max(0)+1).argsort()]
Out[63]: 
array([[ 0,  1,  1],
       [ 0,  3,  2],
       [ 1,  1,  1],
       [ 1,  4, 10],   # <= New row moved here
       [ 1,  5,  2]])

In [64]: B[np.lexsort(B[:,::-1].T)]
Out[64]: 
array([[ 0,  1,  1],
       [ 0,  3,  2],
       [ 1,  1,  1],
       [ 1,  4, 10],   # <= New row moved here
       [ 1,  5,  2]])