【Python No.6】numpyのソート機能

シェアする

ソートは結構使いますが,いつも忘れてしまうので,ここで纏めてみます.

いつものように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().