NumPy配列の最大値/最小値に関する関数 2015/06/06
NumPyには名前にmaxとかminとかが付いている最大値/最小値に関する関数がたくさんあるので、ここでまとめてみた。以下の説明は最大値maxに関してだが、maxをminに置き換えれば最小値になる。
まず、NumPyをimportして、サンプルデータとして2つの配列を定義。
import numpy as np
nan = float("nan")
ndarr1 = np.array([1.0, 5.0, 4.5, 2.1, 0.0])
ndarr2 = np.array([2.0, 6.0, 7.0, nan, -1.0])
配列の中の最大値を普通に求めるには max
を使う。
print(np.max(ndarr1))
# 出力結果
# 5.0
max
はメソッドの形式で呼び出してもOKみたい。
print(ndarr1.max())
# 出力結果
# 5.0
よくわからないが amax
という名前も同じっぽい。
print(np.amax(ndarr1))
# 出力結果
# 5.0
NaNが含まれる配列に対して使うと、最大値もNaNになる。
print(np.max(ndarr2))
# 出力結果
# nan
print(ndarr2.max())
# 出力結果
# nan
print(np.amax(ndarr2))
# 出力結果
# nan
nanmax
という関数を使うとNaNを無視して最大値を計算してくれる。
print(np.nanmax(ndarr1))
# 出力結果
# 5.0
print(np.nanmax(ndarr2))
# 出力結果
# 7.0
今度は最大値ではなく、最大値となる要素のインデックスを求める方法。argmax
という関数を使う。数式で表現すれば \( \mathop{\arg\,\max}\limits_i a_i \)。最大値が同値で複数ある場合は先頭に近い方のインデックスになる。
print(np.argmax(ndarr1))
# 出力結果
# 1
NaNが含まれる配列に対して argmax
を使うと、NaNが最大値とみなされてそのインデックスが返される。
print(np.argmax(ndarr2))
# 出力結果
# 3
nanargmax
を使えば、NaNを無視してくれる。
print(np.nanargmax(ndarr1))
# 出力結果
# 1
print(np.nanargmax(ndarr2))
# 出力結果
# 2
以上は1つの配列の中での最大値に関するものだったが、2つの配列の要素同士を比較して、大きい方をピックアップした配列を作る maximum
という関数もある。同じ大きさの2つの配列を渡して、同じ大きさの配列が返ってくる。
print(np.maximum(ndarr1, ndarr2))
# 出力結果
# [ 2. 6. 7. nan 0.]
maximum
はNaNが含まれるとNaNのほうが大きいと見なされるが、代わりにfmax
を使えばNaNでないほうが大きいと見なされる。
print(np.fmax(ndarr1, ndarr2))
# 出力結果
# [ 2. 6. 7. 2.1 0. ]
axis
という名前付きのオプション引数
2015/06/06
平均(mean
)や合計(sum
)を計算する関数と同じく、
axis
という名前付き引数で最大値・最小値を見る軸を指定できる。
ndarr1 = np.array([[1., 2., 3.], [9., 9.8, 9.4], [4., 6., 4.5]])
print(np.max(ndarr1, axis = 0))
print(np.amax(ndarr1, axis = 0))
print(ndarr1.max(axis = 0))
# 出力結果(3つとも同じ)
# [ 9. 9.8 9.4]
print(np.max(ndarr1, axis = 1))
print(np.amax(ndarr1, axis = 1))
print(ndarr1.max(axis = 1))
# 出力結果(3つとも同じ)
# [ 3. 9.8 6. ]