1. ホーム
  2. パイソン

[解決済み】NumPyで配列を列でソートする

2022-03-24 09:30:28

質問

NumPyで配列をn番目の列でソートするには?

例えば

a = array([[9, 2, 3],
           [4, 5, 6],
           [7, 0, 5]])

2番目の列で行を並べ替えたいのですが。

array([[7, 0, 5],
       [9, 2, 3],
       [4, 5, 6]])

解決方法は?

スティーブ 's 答え は、実は最もエレガントな方法なのです。

の order キーワード引数を参照してください。 numpy.ndarray.sort

しかし、配列をフィールドを持つ配列(構造化配列)として見る必要があります。

正しい方法は、最初にフィールドを持つ配列を定義していない場合、非常に醜いものになります。

簡単な例として、ソートしてコピーを返す場合。

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列目の順でソートすることが可能です。