首先,用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]])