こんにちは、インストラクターのフクロウです!
NumPyには、配列をソートする関数のnp.sortがあります。
これに対して、ソートした配列の要素のインデックスを返す関数がnp.argsortです。
この記事では、np.argsort関数の基本的な使い方から、多次元配列に対する使い方までをご説明します!
np.argsortで一次元配列をソートする
この記事で使っているf-stringsという機能は比較的新しい書き方なので、気になった方は以下の記事で確認して下さいね。
さて、まずは簡単な使い方を確認しましょう。
使い方はnp.sortと同様です!
import numpy as np
a = np.random.random(5)
print(
f"""Original a
{a}
np.sort(a)
{np.sort(a)}
np.argsort(a)
{np.argsort(a)}
"""
)
[出力結果]
Original a
[0.4142068 0.5381178 0.53869381 0.16719389 0.14693401]
np.sort(a)
[0.14693401 0.16719389 0.4142068 0.5381178 0.53869381]
np.argsort(a)
[4 3 0 1 2]
np.sort関数の出力値を確認したら、各要素が元の配列のどのIndexだったかを確認してみてください!
しっかりnp.argsortの出力と同じになっているはずです。
np.argsortで多次元配列をソートする
基本的な使い方
さて、argsortは出力がindexになっているだけで、多次元配列でも使い方はnp.sortと同じです。
どのような動作をするか見てみましょう。
b = np.random.random((4,5))
print(
f"""Original b
{b}
np.sort(b)
{np.sort(b)}
np.argsort(b)
{np.argsort(b)}
"""
)
[出力結果]
Original b
[[0.97935047 0.90121107 0.80337142 0.18207252 0.23487007]
[0.70830563 0.18397233 0.06510502 0.12959257 0.54751296]
[0.40600083 0.12071886 0.03439174 0.82277469 0.3728914 ]
[0.17822189 0.33712262 0.487275 0.89956249 0.95184833]]
np.sort(b)
[[0.18207252 0.23487007 0.80337142 0.90121107 0.97935047]
[0.06510502 0.12959257 0.18397233 0.54751296 0.70830563]
[0.03439174 0.12071886 0.3728914 0.40600083 0.82277469]
[0.17822189 0.33712262 0.487275 0.89956249 0.95184833]]
np.argsort(b)
[[3 4 2 1 0]
[2 3 1 4 0]
[2 1 4 0 3]
[0 1 2 3 4]]
ソートしたい配列だけを引数にすると、各行の中でソートを行っていることがわかりますね。
axisを使ったargsort
多次元配列のソートでは、axisパラメータを指定することができます。
axisを指定することで、配列をソートする軸を変更することができます。
axis=0
axis=0では、列ごとに見て要素をソートすることができます。
print(
f"""Original b
{b}
np.sort(b)
{np.sort(b, axis=0)}
np.argsort(b)
{np.argsort(b, axis=0)}
"""
)
[出力結果]
Original b
[[0.97935047 0.90121107 0.80337142 0.18207252 0.23487007]
[0.70830563 0.18397233 0.06510502 0.12959257 0.54751296]
[0.40600083 0.12071886 0.03439174 0.82277469 0.3728914 ]
[0.17822189 0.33712262 0.487275 0.89956249 0.95184833]]
np.sort(b)
[[0.17822189 0.12071886 0.03439174 0.12959257 0.23487007]
[0.40600083 0.18397233 0.06510502 0.18207252 0.3728914 ]
[0.70830563 0.33712262 0.487275 0.82277469 0.54751296]
[0.97935047 0.90121107 0.80337142 0.89956249 0.95184833]]
np.argsort(b)
[[3 2 2 1 0]
[2 1 1 0 2]
[1 3 3 2 1]
[0 0 0 3 3]]
axis=1
axis=1では、行ごとに見て要素をソートすることができます。
print(
f"""Original b
{b}
np.sort(b)
{np.sort(b, axis=1)}
np.argsort(b)
{np.argsort(b, axis=1)}
"""
)
[出力結果]
Original b
[[0.97657721 0.36010893 0.14086801]
[0.09089705 0.92285532 0.27189188]]
np.sort(b)
[[0.14086801 0.36010893 0.97657721]
[0.09089705 0.27189188 0.92285532]]
np.argsort(b)
[[2 1 0]
[0 2 1]]
これらを使うことで、より柔軟なソートができますね。
まとめ
この記事では、配列のソートしたインデックスを返す関数であるnp.argsortを紹介しました。
最大値や最小値のみを取り出す機能はありましたが、np.argsortを使えば
- 上位N個の要素を取り出す
- 下位N個の要素を取り出す
などの操作も簡単にできます。
ぜひ覚えて便利に使いこなしてください!






