插入行插入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]])
我应该怎么办呢?
答
首先,与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]])