NumPy配列の最大値/最小値に関する関数

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 という名前付きのオプション引数

平均(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. ]

関連

このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。