2016-05-14 6 views
1

に行を挿入私は:numpyのアレイがそのように最初の要素と第2要素とに基づいてソートされ はnumpyのアレイ

A = np.array([[0,1,1],[0,3,2],[1,1,1],[1,5,2]]) 

私は、出力になるよう、A[1,4,10]を挿入したい:

A = array([[0,1,1],[0,3,2],[1,1,1],[1,4,10][1,5,2]])     

私はそれをどのようにすればよいですか?各行を仮定する、各行の要素の上に第2及び第1とを考慮した優先順位を維持するために、今

B = np.vstack((A,[1,4,10])) 

-

答えて

2

まずオフは、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]]) 
関連する問題