ソートは結構使いますが,いつも忘れてしまうので,ここで纏めてみます.
いつものようにnumpyで乱数配列を作成します.
>>> import numpy as np
>>> x = np.random.randn(5)
>>> x
array([ 0.32245135, -0.42398254, 0.73824347, 0.1104799 , -0.60508953])
これをソートするには,x.sort()でもいいですが,numpyの関数を使う方が使いやすいかもしれません(これまでの言語に慣れている人には)
>>> np.sort(x)
array([-0.60508953, -0.42398254, 0.1104799 , 0.32245135, 0.73824347])
それで,ソート後の配列要素のインデックスを得ることも結構使います.その場合は,
>>> np.argsort(x)
array([4, 1, 3, 0, 2])
とすればよい.つまり,元の配列の4番目が一番小さい値で,次に小さいのは1番目の値で,・・・・,一番大きい値は2番目の値だったというわけです.
np.sort()やnp.argsort()は小さい順に並び替える関数ですが,逆に大きい順に並び替えるには,符号を変えてやれば簡単にできます.つまり,
>>> -np.sort(-x)
array([ 0.73824347, 0.32245135, 0.1104799 , -0.42398254, -0.60508953])
>>> np.argsort(-x)
array([2, 0, 3, 1, 4])
とすればOK.ここから,たとえば大きい順に上位3つの値に対応するインデックス(2,0,3)に対応する値を別の配列yからを取り出すときは,
>>> y = np.random.randn(5)
>>> ind = np.sort(-x)
>>> y[ind[0:3]]
こんな感じで書けます.この最後の書き方が出来るのがnumpy配列の良さで,普通のリストでは出来ません.なんと便利な!
まとめ
numpy配列について,値そのものをソートするときはnp.sort(),ソート後のインデックスを得るにはnp.argsort().