我有:
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]])
我该怎么做?
答案 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]])