今回はNumPyのargsortについて説明します。
argsortは、なかなか分かりにくい所があり、簡単に説明しようと思います。
では、早速始めてみましょう。
『sort』と『argsort』について
『sort』という言葉は、整理するという意味があります。NumPyは数列を扱うライブラリなので、数列を整理する関数、『sort』が準備されてます。そして、この『sort』と似た関数で、『argsort』があります。
『sort』は、数列を小さい順に並び変えます。
『argsort』は、数列を小さい順に並べた時に対しての元の数列をインデックスで表示します。
言葉だけではわかりにくいので、実際にプログラムを走らせてみましょう。
『sort』と『argsort』の出力結果
では、この関数の実際に使ってみます。
import numpy as np x=np.array([100, 10, 32, 45, 53, 86]) print(x) print(np.sort(x)) print(np.argsort(x))
xの元の配列 [100 10 32 45 53 86] xをsortした場合 [ 10 32 45 53 86 100] xをargsortした場合 [1 2 3 4 5 0]
print(x)の場合、そのまま配列が出力されます。これはそのままなので、理解できますよね。
print(np.sort(x))の場合、xの配列が、数字が小さい順に並び変えられていることが分かります。これも理解できますよね。
print(np.argsort(x))の場合、????となりませんか?
簡単に説明しますね。
argsortの関数は、まず、xの数列をsortします。ということで、sortした並びは、np.sort(x)と同じになります。
[ 10, 32, 45, 53, 86, 100]
最後に、この並び替えられた数列は、元の数列の何番目に入ってるか(インデックス化)を表示します。これがargsort関数なのです。
xの元の並びは[100, 10, 32, 45, 53, 86]です。
数列は、左から0番と数えます。ということで、100は0番目、86は4番目になります。
100は元の数列では、0番目、10は元の数列では、1番目、32は元の数列では、2番目になります。
argsortは、最初に数列をsortするので、数列は[ 10, 32, 45, 53, 86, 100]という並びに代わり、次に数列をンデックス化するので、[1, 2, 3, 4, 0]という数列が出力がされます。
理解できたでしょうか?
二次元配列で『sort』と『argsort』の出力結果
次は二次元配列を使って、理解を深めましょう。
import numpy as np xa = np.array([ [21, 31, 11, 41], [52, 22, 12, 32], [13, 93, 83, 23]]) print(xa) print(np.sort(xa)) print(np.argsort(xa))
xaの元の配列 [[21 31 11 41] [52 22 12 32] [13 93 83 23]] xaのsort後の配列 [[11 21 31 41] [12 22 32 52] [13 23 83 93]] xaのargsort後の配列 [[2 0 1 3] [2 1 3 0] [0 3 2 1]]
上記の場合は、行ごとにsortされています。(axisという変数を加えると、列ごとにもsortすることが出来ますが、今回はargsortの理解の為に省いています。)
少し、パズルのような感じになってしまいましたが、argsortの理解は深まったでしょうか。まだ、ちょっと分かりにくいと思われましたら、数列の数を減らして、出力してみて下さい。何度かトレイすると、必ず理解できると思います。
まとめ
いかがだったでしょうか。
sort、argsortはNumpyを使う上で、重要な関数になるので、必ず覚えておくようにしておきましょうね。
コメント