NumPy:最大値・最小値とその位置を求める(max, min, argmax, argmin)

データの最大値・最小値を求める maxmin と、その位置(インデックス)を求める argmaxargmin を紹介します。

最大値と最小値:max, min

np.max()np.min() は、配列内の最大値・最小値を返します。

import numpy as np

data = np.array([3, 1, 4, 1, 5, 9, 2, 6])

print(np.max(data))  # 9
print(np.min(data))  # 1

メソッドとしても使えます。

print(data.max())  # 9
print(data.min())  # 1

最大値・最小値の位置:argmax, argmin

np.argmax()np.argmin() は、最大値・最小値のインデックスを返します。

data = np.array([3, 1, 4, 1, 5, 9, 2, 6])

print(np.argmax(data))  # 5(data[5] = 9 が最大)
print(np.argmin(data))  # 1(data[1] = 1 が最小)

最大値が複数ある場合は、最初に見つかった位置を返します。

data = np.array([1, 3, 3, 2])
print(np.argmax(data))  # 1(最初の3のインデックス)

多次元配列での使用

2次元配列では、axis を指定して行方向・列方向に計算できます。

a = np.array([[1, 5, 3],
              [4, 2, 6]])

# 全体の最大値
print(np.max(a))  # 6

# 列ごとの最大値(axis=0)
print(np.max(a, axis=0))  # [4 5 6]

# 行ごとの最大値(axis=1)
print(np.max(a, axis=1))  # [5 6]

argmax も同様に軸を指定できます。

a = np.array([[1, 5, 3],
              [4, 2, 6]])

# 列ごとの最大値の位置
print(np.argmax(a, axis=0))  # [1 0 1]
# 0列目は4が最大(行1)、1列目は5が最大(行0)、2列目は6が最大(行1)

# 行ごとの最大値の位置
print(np.argmax(a, axis=1))  # [1 2]
# 0行目は5が最大(列1)、1行目は6が最大(列2)

最大値とその位置を同時に取得

最大値とインデックスの両方が必要なときは、別々に呼び出します。

data = np.array([3, 1, 4, 1, 5, 9, 2, 6])

max_idx = np.argmax(data)
max_val = data[max_idx]

print(f"最大値: {max_val}, 位置: {max_idx}")
# 最大値: 9, 位置: 5

2次元配列で全体の最大位置を取得

argmax() を軸指定なしで呼ぶと、平坦化した配列でのインデックスが返ります。元の2次元での位置が欲しいときは np.unravel_index() を使います。

a = np.array([[1, 5, 3],
              [4, 2, 6]])

flat_idx = np.argmax(a)  # 5(平坦化後のインデックス)
row, col = np.unravel_index(flat_idx, a.shape)

print(f"最大値: {a[row, col]}, 位置: ({row}, {col})")
# 最大値: 6, 位置: (1, 2)

nanを含む配列

データに nan(欠損値)が含まれる場合、通常の max/minnan を返します。nan を無視したい場合は np.nanmax()np.nanmin() を使います。

data = np.array([1, 2, np.nan, 4, 5])

print(np.max(data))     # nan
print(np.nanmax(data))  # 5.0(nanを無視)

位置を取得する np.nanargmax()np.nanargmin() もあります。