NumPy配列で最大値・最小値のインデックスを特定!np.argmax, np.argminを使いこなす


 

NumPy配列(ndarray)を分析する際、「配列の中で最も大きい(または小さい)値がどこにあるのか?」を知りたい場面はよくあります。単に最大値・最小値そのものを知るだけでなく、その値が配列のどの位置(インデックス)にあるのかを特定することは、データの特徴を理解したり、特定のデータポイントにアクセスしたりするために非常に重要です。この記事では、NumPy配列の最大値・最小値のインデックス(位置)を取得するためのnp.argmax()np.argmin()関数について、具体的なサンプルコードを交えながら詳しく解説します。


 

np.argmax()np.argmin()とは?

 

NumPyには、配列内の最大値または最小値のインデックスを返す専用の関数があります。

  • np.argmax(a, axis=None): 配列a内の最大値のインデックスを返します。

  • np.argmin(a, axis=None): 配列a内の最小値のインデックスを返します。

どちらの関数も、axis引数を指定することで、配列全体だけでなく、特定の軸(行または列)に沿ってインデックスを取得できます。


 

np.argmax():最大値のインデックスを取得

 

 

1. 1次元配列での使用

 

1次元配列の場合、最大値のインデックス(0から始まる位置)を返します。

 

サンプルコード

 

Python
 
import numpy as np

arr_1d = np.array([10, 5, 20, 15, 30])

# 最大値のインデックスを取得
max_idx = np.argmax(arr_1d)
print("最大値のインデックス:", max_idx)
print("最大値:", arr_1d[max_idx])

 

出力例

 

最大値のインデックス: 4
最大値: 30

 

2. 多次元配列での使用(axis引数なし)

 

axis引数を省略すると、多次元配列は1次元に平坦化されたものとみなされ、その中の最大値のインデックスが返されます。

 

サンプルコード

 

Python
 
import numpy as np

arr_2d = np.array([[10, 2, 30],
                   [40, 50, 6],
                   [7, 8, 9]])

# 配列全体の最大値のインデックス (平坦化された場合)
max_idx_flat = np.argmax(arr_2d)
print("配列全体の最大値のインデックス (平坦化):", max_idx_flat)
# 元の配列の形状を考慮した座標に変換するには `np.unravel_index` を使うと便利
print("元の配列での座標:", np.unravel_index(max_idx_flat, arr_2d.shape))
print("最大値:", arr_2d[np.unravel_index(max_idx_flat, arr_2d.shape)])

 

出力例

 

配列全体の最大値のインデックス (平坦化): 4
元の配列での座標: (1, 1)
最大値: 50

 

3. 列方向(axis=0)での最大値インデックス取得

 

各列内で最大値を持つ要素の行インデックスを返します。

 

サンプルコード

 

Python
 
import numpy as np

arr_2d = np.array([[10, 2, 30],
                   [40, 50, 6],
                   [7, 8, 9]])

# 各列の最大値の行インデックスを取得
max_idx_cols = np.argmax(arr_2d, axis=0)
print("各列の最大値の行インデックス:", max_idx_cols)
# 各列の最大値そのものを取得したい場合
print("各列の最大値:", arr_2d[max_idx_cols, np.arange(arr_2d.shape[1])])

 

出力例

 

各列の最大値の行インデックス: [1 1 0]
各列の最大値: [40 50 30]

 

4. 行方向(axis=1)での最大値インデックス取得

 

各行内で最大値を持つ要素の列インデックスを返します。

 

サンプルコード

 

Python
 
import numpy as np

arr_2d = np.array([[10, 2, 30],
                   [40, 50, 6],
                   [7, 8, 9]])

# 各行の最大値の列インデックスを取得
max_idx_rows = np.argmax(arr_2d, axis=1)
print("各行の最大値の列インデックス:", max_idx_rows)
# 各行の最大値そのものを取得したい場合
print("各行の最大値:", arr_2d[np.arange(arr_2d.shape[0]), max_idx_rows])

 

出力例

 

各行の最大値の列インデックス: [2 1 2]
各行の最大値: [30 50  9]

 

np.argmin():最小値のインデックスを取得

 

np.argmin()np.argmax()と対称的な関数で、最大値の代わりに最小値のインデックスを返します。使い方はnp.argmax()と全く同じです。

 

1. 1次元配列での使用

 

 

サンプルコード

 

Python
 
import numpy as np

arr_1d = np.array([10, 5, 20, 1, 30])

# 最小値のインデックスを取得
min_idx = np.argmin(arr_1d)
print("最小値のインデックス:", min_idx)
print("最小値:", arr_1d[min_idx])

 

出力例

 

最小値のインデックス: 3
最小値: 1

 

2. 多次元配列での使用(行方向、axis=1

 

 

サンプルコード

 

Python
 
import numpy as np

arr_2d = np.array([[10, 2, 30],
                   [40, 50, 6],
                   [7, 8, 9]])

# 各行の最小値の列インデックスを取得
min_idx_rows = np.argmin(arr_2d, axis=1)
print("各行の最小値の列インデックス:", min_idx_rows)
print("各行の最小値:", arr_2d[np.arange(arr_2d.shape[0]), min_idx_rows])

 

出力例

 

各行の最小値の列インデックス: [1 2 0]
各行の最小値: [2 6 7]

 

まとめ

 

NumPyのnp.argmax()np.argmin()関数は、配列内の最大値または最小値がどこにあるのかを知るために不可欠なツールです。

  • np.argmax(arr, axis=...): 最大値のインデックスを返します。

  • np.argmin(arr, axis=...): 最小値のインデックスを返します。

これらの関数は、axis引数を活用することで、配列全体、行ごと、列ごとなど、多様なニーズに応じたインデックスの取得が可能です。データの中から特定の条件を満たす要素の位置を素早く特定し、その後の分析や処理に役立てるために、ぜひこれらの関数を使いこなしてください!