np.lexsortを使用できます:
numpy.lexsort(keys、axis = -1)
キーのシーケンスを使用して間接ソートを実行します。
スプレッドシートの列として解釈できる複数の並べ替えキーを指定すると、lexsortは、複数の列による並べ替え順序を説明する整数インデックスの配列を返します。
In [13]: data = np.matrix(np.arange(10)[::-1].reshape(-1,2))
In [14]: data
Out[14]:
matrix([[9, 8],
[7, 6],
[5, 4],
[3, 2],
[1, 0]])
In [15]: temp = data.view(np.ndarray)
In [16]: np.lexsort((temp[:, 1], ))
Out[16]: array([4, 3, 2, 1, 0])
In [17]: temp[np.lexsort((temp[:, 1], ))]
Out[17]:
array([[1, 0],
[3, 2],
[5, 4],
[7, 6],
[9, 8]])
に複数のキーを渡す場合はnp.lexsort
、最後のキーが主キーであることに注意してください。最後から2番目のキーは2番目のキーであり、以下同様です。
上で示したように使用するには、 numpy行列では機能しないnp.lexsort
ため、一時配列を使用する必要があります。のコピーではなくビューを作成するnp.lexsort
ため
、余分なメモリはあまり必要ありません。でも、temp = data.view(np.ndarray)
data
temp[np.lexsort((temp[:, 1], ))]
は新しいアレイであり、より多くのメモリを必要とします。
その場で列で並べ替える方法もあります。アイデアは、配列を2列の構造化配列として表示することです。プレーンなndarrayとは異なり、構造化配列には、sort
列をキーとして指定できるメソッドがあります。
In [65]: data.dtype
Out[65]: dtype('int32')
In [66]: temp2 = data.ravel().view('int32, int32')
In [67]: temp2.sort(order = ['f1', 'f0'])
temp2
はのビューであるdata
ため、新しいメモリを割り当てたり、配列をコピーしたりする必要がないことに注意してください。また、並べ替えは同時にtemp2
変更されます。data
In [69]: data
Out[69]:
matrix([[1, 0],
[3, 2],
[5, 4],
[7, 6],
[9, 8]])