まずオフは、np.vstack
と最後の行のような新たな1Dアレイを積み重ねます索引付けタプルとして、ソートされたインデックスを取得します。これは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]])