numpyのargsortの使い方を解説

Python

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は配列のソート順序を示すインデックスを取得する便利な関数です。基本的な使い方から、ソートアルゴリズムの指定、構造化配列での使用まで、様々な場面で活用できます。元の配列を変更せずにソート情報を取得できるため、複数の関連する配列を同じ順序で並び替える際に特に有用です。

タイトルとURLをコピーしました