NumPy配列のソート術!sortとargsortで任意の行・列を基準に並べ替え
データ分析や数値計算において、NumPy配列(ndarray)のデータを特定の基準で並べ替える(ソートする)操作は非常に重要です。NumPyには、配列全体や特定の軸に沿ってソートを行うための強力な関数がいくつか提供されています。この記事では、np.sort関数とnp.argsort関数を使って、NumPy配列の任意の行や列を基準にデータをソートする方法について、具体的なサンプルコードを交えながら詳しく解説します。
NumPyのソート関数の基本
NumPyには、ソートに関する主要な関数が2つあります。
-
np.sort(): 元の配列をソートした新しい配列を返します。元の配列は変更されません。 -
np.argsort(): 元の配列をソートした際に得られるインデックスの配列を返します。このインデックスを使って、元の配列や関連する他の配列をソートできます。
np.sort():特定の軸に沿ってソートする
np.sort()関数は、axis引数を指定することで、配列の特定の軸(行または列)に沿って要素をソートできます。
書式
numpy.sort(a, axis=-1, kind=None, order=None)
-
a: ソートしたい元の配列。 -
axis: ソートする軸を指定します。-
axis=0: 列方向(各列内でソート) -
axis=1: 行方向(各行内でソート) -
axis=None: 配列全体をフラットにしてソート -
デフォルトは
-1で、最後の軸を意味します。
-
1. 行方向(axis=1)にソートする
各行の要素をそれぞれ独立して昇順にソートします。
サンプルコード
import numpy as np
arr_2d = np.array([[3, 1, 2],
[6, 4, 5]])
print("元の配列:\n", arr_2d)
# 各行を昇順にソート
sorted_rows = np.sort(arr_2d, axis=1)
print("\n行方向にソートした配列:\n", sorted_rows)
出力例
元の配列:
[[3 1 2]
[6 4 5]]
行方向にソートした配列:
[[1 2 3]
[4 5 6]]
2. 列方向(axis=0)にソートする
各列の要素をそれぞれ独立して昇順にソートします。
サンプルコード
import numpy as np
arr_2d = np.array([[3, 1, 2],
[6, 4, 5]])
print("元の配列:\n", arr_2d)
# 各列を昇順にソート
sorted_cols = np.sort(arr_2d, axis=0)
print("\n列方向にソートした配列:\n", sorted_cols)
出力例
元の配列:
[[3 1 2]
[6 4 5]]
列方向にソートした配列:
[[3 1 2]
[6 4 5]]
※この例では元の配列の列が既にソートされているため変化がありません。
np.argsort():特定の行・列を基準に配列全体をソートする
np.sort()が各軸内でソートするのに対し、np.argsort()は特定の行や列の値を基準にして、配列全体の行や列を並べ替えたい場合に非常に強力です。np.argsort()は、ソートされた要素の元のインデックスを返します。
1. 特定の列を基準に行をソートする
例えば、「2次元配列の2列目の値を基準に、行全体をソートしたい」といった場合にnp.argsort()が役立ちます。
サンプルコード
import numpy as np
arr_2d = np.array([[10, 30, 20],
[50, 10, 60],
[30, 20, 40]])
print("元の配列:\n", arr_2d)
# 2列目(インデックス1)の値を基準にソート
# arg_sort_indicesは、ソート後の行の新しいインデックス順を示す
arg_sort_indices = np.argsort(arr_2d[:, 1])
print("\n2列目を基準としたソートインデックス:", arg_sort_indices)
# ソートインデックスを使って行を並べ替え
sorted_arr_by_col = arr_2d[arg_sort_indices]
print("\n2列目を基準に行をソートした配列:\n", sorted_arr_by_col)
出力例
元の配列:
[[10 30 20]
[50 10 60]
[30 20 40]]
2列目を基準としたソートインデックス: [1 2 0]
2列目を基準に行をソートした配列:
[[50 10 60]
[30 20 40]
[10 30 20]]
2. 特定の行を基準に列をソートする
特定の行の値を基準に、列全体を並べ替えることも可能です。
サンプルコード
import numpy as np
arr_2d = np.array([[10, 50, 30],
[20, 10, 40],
[30, 20, 10]])
print("元の配列:\n", arr_2d)
# 1行目(インデックス0)の値を基準にソート
arg_sort_indices = np.argsort(arr_2d[0, :])
print("\n1行目を基準としたソートインデックス:", arg_sort_indices)
# ソートインデックスを使って列を並べ替え
sorted_arr_by_row = arr_2d[:, arg_sort_indices]
print("\n1行目を基準に列をソートした配列:\n", sorted_arr_by_row)
出力例
元の配列:
[[10 50 30]
[20 10 40]
[30 20 10]]
1行目を基準としたソートインデックス: [0 2 1]
1行目を基準に列をソートした配列:
[[10 30 50]
[20 40 10]
[30 10 20]]
まとめ
NumPyのsortとargsort関数は、配列の並べ替えにおいて非常に強力で柔軟なツールです。
-
np.sort(a, axis=...): 各行や各列の要素を独立してソートした新しい配列を返します。 -
np.argsort(a, axis=...): ソート結果のインデックス配列を返します。このインデックスを利用することで、特定の行や列の値を基準にして配列全体(または他の関連配列)を並べ替えることが可能になります。特に、多次元配列を行や列ごとに入れ替えたい場合に非常に役立ちます。
これらのソート機能を適切に使いこなすことで、データの前処理、ランキング付け、特定の基準に基づいたデータの整理などが効率的に行えるようになります。ぜひ、あなたのNumPyワークフローに取り入れてみてください!

