numpyのargsortは配列をソートした際のインデックスを返す関数です。元の配列は変更せずに、ソート後の順序を示すインデックス配列を取得できます。本記事では、argsortの基本的な使い方から詳細な設定まで、実用的な例とともに解説します。
基本的な使い方
argsortは配列の要素をソートした際のインデックスを昇順で返します。
import numpy as np
# 1次元配列の例
arr = np.array([3, 1, 4, 1, 5])
indices = np.argsort(arr)
print(indices) # [1 3 0 2 4]
print(arr[indices]) # [1 1 3 4 5]
2次元配列では軸を指定してソートできます。
# 2次元配列の例
arr_2d = np.array([[3, 1, 4], [1, 5, 9]])
indices_axis0 = np.argsort(arr_2d, axis=0)
print(indices_axis0)
# [[1 0 0]
# [0 1 1]]
indices_axis1 = np.argsort(arr_2d, axis=1)
print(indices_axis1)
# [[1 0 2]
# [0 1 2]]
詳細な設定
ソートアルゴリズムの指定
kindパラメータでソートアルゴリズムを指定できます。’quicksort‘、’mergesort‘、’heapsort‘、’stable‘から選択可能です。
arr = np.array([3, 1, 4, 1, 5])
# クイックソート(デフォルト)
indices_quick = np.argsort(arr, kind='quicksort')
print(indices_quick) # [1 3 0 2 4]
# マージソート
indices_merge = np.argsort(arr, kind='mergesort')
print(indices_merge) # [1 3 0 2 4]
# ヒープソート
indices_heap = np.argsort(arr, kind='heapsort')
print(indices_heap) # [1 3 0 2 4]
構造化配列のフィールド指定
orderパラメータで構造化配列の特定のフィールドでソートできます。
# 構造化配列の例
dtype = [('name', 'U10'), ('age', int)]
arr = np.array([('Alice', 25), ('Bob', 30), ('Charlie', 20)], dtype=dtype)
# 年齢でソート
indices_age = np.argsort(arr, order='age')
print(arr[indices_age])
# [('Charlie', 20) ('Alice', 25) ('Bob', 30)]
# 名前でソート
indices_name = np.argsort(arr, order='name')
print(arr[indices_name])
# [('Alice', 25) ('Bob', 30) ('Charlie', 20)]
安定ソートの使用
stableソートは同じ値の要素の相対的な順序を保持します。
# 同じ値を含む配列
arr = np.array([3, 1, 4, 1, 5])
original_indices = np.arange(len(arr))
# 安定ソート
indices_stable = np.argsort(arr, kind='stable')
print(indices_stable) # [1 3 0 2 4]
# 元のインデックスと比較
print("元の配列:", arr)
print("元のインデックス:", original_indices)
print("ソート後のインデックス:", indices_stable)
np.sortとの違い
np.sortは実際の値をソートして返しますが、argsortはインデックスを返します。
arr = np.array([3, 1, 4, 1, 5])
# np.sortは値を返す
sorted_values = np.sort(arr)
print("ソート後の値:", sorted_values) # [1 1 3 4 5]
# argsortはインデックスを返す
sorted_indices = np.argsort(arr)
print("ソート後のインデックス:", sorted_indices) # [1 3 0 2 4]
# argsortの結果を使って元の配列から値を取得
print("インデックスで取得した値:", arr[sorted_indices]) # [1 1 3 4 5]
argsortの利点は元の配列を変更せずに、ソート順序の情報を保持できることです。
# 複数の配列を同じ順序でソート
names = np.array(['Alice', 'Bob', 'Charlie'])
scores = np.array([85, 92, 78])
# スコアの順序でソート
indices = np.argsort(scores)
print("ソート後の名前:", names[indices]) # ['Charlie' 'Alice' 'Bob']
print("ソート後のスコア:", scores[indices]) # [78 85 92]
まとめ
numpyのargsortは配列のソート順序を示すインデックスを取得する便利な関数です。基本的な使い方から、ソートアルゴリズムの指定、構造化配列での使用まで、様々な場面で活用できます。元の配列を変更せずにソート情報を取得できるため、複数の関連する配列を同じ順序で並び替える際に特に有用です。