NumPyの配列(ndarray)をソートする方法(sort, argsort)について解説します。
Contents
配列をソートする ~ sort ~
NumPyの配列(ndarray)をソートする際には、sort関数を使用します。sortを使用した簡単な例を見て使い方を紹介します。
昇順にソートする
NumPyの配列を値の昇順にソートしたい場合には、以下のようにsort関数を使用します。
import numpy as np x = np.array([5, 2, 4, 6, 1]) print(f'x = {x}') # 昇順にソートする場合 x_sorted = np.sort(x) print(f'x_sorted = {x_sorted}')
【実行結果】 x = [5 2 4 6 1] x_sorted = [1 2 4 5 6]
降順にソートする
NumPyの配列を値を降順にソートしたい場合には、以下のようにスライス記法を使ってソートした配列を反転することで対応します。
Python組み込みのリストのソートに慣れている人は「reverse=True」と指定したくなるかもしれませんが、NumPyのsort関数にはそういった引数は指定できません。
import numpy as np x = np.array([5, 2, 4, 6, 1]) print(f'x = {x}') # 降順にソートする場合 x_sorted = np.sort(x)[::-1] print(f'x_sorted = {x_sorted}')
【実行結果】 x = [5 2 4 6 1] x_sorted = [6 5 4 2 1]
numpy.sortの公式ドキュメントの説明はこちらを参照してください。
kind引数でソートアルゴリズムを変更することが可能です。ソートアルゴリズムとしては「quicksort」「heapsort」「mergesort」「timsort」がありますが、デフォルトはquicksortです。各アルゴリズムの特性を理解しており有効活用できる人は個別に指定してもよいですが、基本的にはデフォルトのquicksortで問題ないと思います。
軸(axis)を指定してソートする
2次元以上の配列を使用している際に、軸に沿ってソートを指定場合にはaxisを指定します。以下の例を見てみましょう。
import numpy as np rand = np.random.RandomState(1) X = rand.randint(0, 10, (5, 5)) print(f'X = \n{X}\n') # 列ごとにソートする X_sorted_col = np.sort(X, axis=0) print(f'X_sorted (axis=0) = \n{X_sorted_col}\n') # 行ごとにソートする X_sorted_row = np.sort(X, axis=1) print(f'X_sorted (axis=1) = \n{X_sorted_row}')
【実行結果】 X = [[5 8 9 5 0] [0 1 7 6 9] [2 4 5 2 4] [2 4 7 7 9] [1 7 0 6 9]] X_sorted (axis=0) = [[0 1 0 2 0] [1 4 5 5 4] [2 4 7 6 9] [2 7 7 6 9] [5 8 9 7 9]] X_sorted (axis=1) = [[0 5 5 8 9] [0 1 6 7 9] [2 2 4 4 5] [2 4 7 7 9] [0 1 6 7 9]]
上記のようにaxis=0は行方向(列単位で)、axis=1は列方向(行単位で)ソートすることができます。
元のデータ自体をソートする
元の配列の値自体をソートしたい場合は、対象とする配列に対して以下のようにsortメソッドを呼び出します。
import numpy as np x = np.array([5, 2, 4, 6, 1]) print(f'x = {x}') # 元の配列自体をソートする場合 x.sort() print(f'x = {x}')
【実行結果】 x = [5 2 4 6 1] x = [1 2 4 5 6]
これまで見てきたのはnumpy.sort関数でしたが、今回は配列(ndarray)のメソッドであるnumpy.ndarray.sortメソッドのため厳密には同じものではない点には注意しましょう。
numpy.ndarray.sortメソッドの公式ドキュメントの説明はこちらを参照してください。
ソート後のインデックスを取得する ~ argsort ~
配列をソートした際にどの要素順でソートされているかを取得するには、argsort関数を使用します。
import numpy as np x = np.array([5, 2, 4, 6, 1]) print(f'x = {x}') # ソートした後のインデックス順を取得する sort_idx = np.argsort(x) print(f'sort_idx = {sort_idx}') # ソートされた配列を取得する print(f'x_sorted = {x[sort_idx]}')
【実行結果】 x = [5 2 4 6 1] sort_idx = [4 1 2 0 3] x_sorted = [1 2 4 5 6]
上記の例を見てもわかるように、argsortで返却されるのは昇順に並べた場合のインデックス番号の配列です。そのため、ソートした値の配列が取得したければ、返却値を元の配列に指定することで取得ができます。
numpy.argsortの公式ドキュメントの説明はこちらを参照してください。
上記で紹介しているソースコードについてはgithubにて公開しています。参考にしていただければと思います。