データの最大値・最小値を求める max、min と、その位置(インデックス)を求める argmax、argmin を紹介します。
最大値と最小値: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/min は nan を返します。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() もあります。