2016-05-14 83 views
1

我有:插入行插入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]])     

我应该怎么办呢?

回答

2

首先,与np.vstack堆叠新1D阵列的最后一行 -

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