
numpyにはargsortという関数があります。ndarrayの中身を実際にソートするわけではなく、ソートをした場合のインデックスを返してくれる関数になります。言葉でみると結構シンプルなのですが、割と初見だと仕様が複雑なのかなと思っています。この記事では、numpy.argsortの仕様を図解しつつ、使い方や昇順、降順にソートする方法などを解説します。
numpy.argsortとは?
numpy.argsortとは、ndarray配列をソートした場合における、インデックスを返す関数になります。ここでポイントなのは、実際に配列をソートすることはなく、ソートを実施した場合のインデックスを返してくれる関数になっています。argsortという名前なので、なんとなくソートされた結果が返ってくるようなイメージがありますが、実際にソートされた結果は返ってきません。
実際にソートを行いたい場合には、sort()を使用しましょう
numpy.argsortの仕様を整理する
まずは実際にargsortをたたいてみるとどのような結果が返ってくるのか見てみましょう。
以下のように、何かしらのインデックスが返ってきていることがわかると思います。
>>> a = np.array([0.8, 0.0, 0.5, 0.7])
>>> a.argsort()
array([1, 2, 3, 0])
どのように処理されているかの概念図が以下になります。
- まず与えられた配列をソートする
- 元のarrayの値がインデックスに変換される
- 元の値で昇順に並べられたインデックスの完成→このインデックスが出力される

ここで重要なのは、インデックスの定義が元のオリジナルのarrayに準拠したものであるという点です。つまりargsort()で取得したインデックスは、元のndarrayに対して使用をすることができるところが大きなポイントになります。
argsortで降順のインデックスを取得する
numpy.argsortはデフォルトで昇順にソートする仕様になっており、降順にソートする機能は存在しません。
しかし、いくつかargsortを工夫して取得する方法があります。
マイナスを使う
a = np.array([30, 10, 20])
idx = np.argsort(-a)
元の配列をマイナスにすることで、値の大小が逆転し、argsort が降順のインデックスを返します。
昇順のインデックスを逆順にする
a = np.array([30, 10, 20])
idx = np.argsort(a)[::-1]
[::-1] は配列を逆順にするスライス記法で、このような書き方をすることで、配列を逆順に得ることが可能です。
まとめ
numpy.argsortについて、仕様の整理と、使い方についてまとめました。結構複雑ですが、こうやって図にすることで理解が深まった気がします。