NumPyで配列をn番目の列でソートするには?
例えば、以下のようになります。
a = array([[9, 2, 3],
[4, 5, 6],
[7, 0, 5]])
行を2番目の列でソートしたいのですが、以下のような結果になります。
array([[7, 0, 5],
[9, 2, 3],
[4, 5, 6]])
これは使えると思います。a[a[:,1].argsort()]
。
これはa
の2列目を示し、それに基づいてソートします。
@steve'の方法は、実際には最もエレガントな方法です。
正しい方法については、numpy.ndarray.sortのorderキーワード引数を参照してください。
ただし、配列をフィールド付きの配列(構造化配列)として捉える必要があります。
正しい方法は、最初にフィールド付きの配列を定義していない場合、非常に醜いものになります。
簡単な例として、配列をソートしてコピーを返す場合。
In [1]: import numpy as np
In [2]: a = np.array([[1,2,3],[4,5,6],[0,0,1]])
In [3]: np.sort(a.view('i8,i8,i8'), order=['f1'], axis=0).view(np.int)
Out[3]:
array([[0, 0, 1],
[1, 2, 3],
[4, 5, 6]])
その場でソートするには
In [6]: a.view('i8,i8,i8').sort(order=['f1'], axis=0) #<-- returns None
In [7]: a
Out[7]:
array([[0, 0, 1],
[1, 2, 3],
[4, 5, 6]])
私の知る限りでは、@Steve'さんの方法が最もエレガントな方法です。
この方法の唯一の利点は、"order"の引数が、検索の順番を決めるフィールドのリストであることです。例えば、order=['f1','f2','f0']を指定すれば、2番目の列、3番目の列、1番目の列の順に並べることができます。
Python documentation wiki]1を見る限り、できると思います。
a = ([[1, 2, 3], [4, 5, 6], [0, 0, 1]]);
a = sorted(a, key=lambda a_entry: a_entry[1])
print a
と出力されています。
[[[0, 0, 1], [1, 2, 3], [4, 5, 6]]]