NumPyのndarrayなどのコレクション要素から最大値を取得するには、np.amax関数かndarrayのメソッドndarray.maxを使用します。

便利関数を知っておくと、研究や開発におけるコーディングが楽になるので、一つ一つしっかりと抑えておくことをオススメします。そこで、今回はmax関数に焦点を絞って

  • np.amaxの使い方
  • ndarray.maxの使い方

について解説します。

np.amax

np.amax関数のAPIドキュメントは以下の通りです。

numpy.amax(a, axis = None, out = None, keepdims=np.NoValue)

params:

パラメータ名 概要
a array_like 最大値を取得する対象のコレクション要素を指定します。
axis int 最大値を求めたい軸の方向を指定します。何も指定しないと配列全体の中における最大値だけを返します。
out array_like 返された値を代入する配列または値を指定します。
keepdims bool Trueを指定すると、次元を維持します。

returns:

配列の中の最大値が返されます。axisを指定すると最大値の配列が返されます。

次のように使用します。最初にndarrayを指定すると、最大の要素を返します。

In [1]: import numpy as np

In [2]: np.amax(np.array([1, 2, 3, 2, 1]))
Out[2]: 3

第二引数のaxisを使用することで、最大の要素を含むndarrayを取得することができます。

In [1]: import numpy as np

In [2]: np.amax(np.array([1, 2, 3, 2, 1]))
Out[2]: 3

In [3]: arr = np.array([1, 2, 3, 4]).reshape((2, 2,))

In [4]: np.amax(arr, axis=0)
Out[4]: array([3, 4])

In [5]: np.amax(arr, axis=1)
Out[5]: array([2, 4])

keepdimsにTrueを指定すると、次元を維持しようと試みます。

In [6]: np.amax(arr, keepdims=True)
Out[6]: array([[4]])

ndarray.max

上記のamaxとほとんど同様の関数として、ndarray.max関数があります。maxのAPIドキュメントは以下の通りです。

numpy.ndarray.max(axis = None, out = None)

params:

パラメータ名 概要
axis int 最大値を求めたい軸の方向を指定します。何も指定しないと配列全体の中における最大値だけを返します。
out array_like 返された値を代入する配列または値を指定します。

returns:

配列の中の最大値が返されます。axisを指定すると最大値の配列が返されます。

(最大値を求めたい配列).max()の形で使います。引数は、axisで最大値を求める軸方向を指定し、outでは返ってきた値を代入する配列や値を指定します。

こちらについても、引数に何も指定しない場合から見ていきましょう。

In [1]: import numpy as np

In [2]: a = np.random.rand(20) # randを使って乱数を20個生成。

In [3]: a
Out[3]:
array([ 0.4079889 ,  0.42521661,  0.01628929,  0.50168737,  0.45866707,
        0.99267926,  0.13282352,  0.64414644,  0.57907025,  0.17062755,
        0.23940831,  0.2237168 ,  0.12609827,  0.3453716 ,  0.28070336,
        0.85881079,  0.1385899 ,  0.58527288,  0.49337656,  0.15560073])

In [4]: a.max()
Out[4]: 0.99267926168679588

In [5]: a = a.reshape((4, 5))

In [6]: a
Out[6]:
array([[ 0.4079889 ,  0.42521661,  0.01628929,  0.50168737,  0.45866707],
       [ 0.99267926,  0.13282352,  0.64414644,  0.57907025,  0.17062755],
       [ 0.23940831,  0.2237168 ,  0.12609827,  0.3453716 ,  0.28070336],
       [ 0.85881079,  0.1385899 ,  0.58527288,  0.49337656,  0.15560073]])

In [7]: a.max()
Out[7]: 0.99267926168679588

引数のaxisを指定してみます。

In [9]: a.max(axis=0) # 引き続きaを用いて最大値を求める。行ごとの最大値。
Out[9]: array([ 0.99267926,  0.42521661,  0.64414644,  0.57907025,  0.45866707])

In [10]: a.max(axis=1) # 列ごとの最大値を求める。
Out[10]: array([ 0.50168737,  0.99267926,  0.3453716 ,  0.85881079])

In [11]: b = np.random.rand(30).reshape((2,3,5)) # 今度は三次元配列で試してみる。

In [12]: b
Out[12]:
array([[[ 0.81056237,  0.31374358,  0.3555333 ,  0.3677503 ,  0.10169583],
        [ 0.59097585,  0.33384972,  0.16766927,  0.11515705,  0.39226259],
        [ 0.90469703,  0.69470498,  0.84976873,  0.48029518,  0.26157859]],

       [[ 0.84307243,  0.55213584,  0.39988459,  0.76043728,  0.4109189 ],
        [ 0.61920673,  0.01330184,  0.77007339,  0.66456173,  0.53900658],
        [ 0.22458252,  0.38850737,  0.21106619,  0.54401199,  0.71752816]]])

In [13]: b.max(axis = 0) # 2つの二次元配列の要素のうちの大きい値
Out[13]:
array([[ 0.84307243,  0.55213584,  0.39988459,  0.76043728,  0.4109189 ],
       [ 0.61920673,  0.33384972,  0.77007339,  0.66456173,  0.53900658],
       [ 0.90469703,  0.69470498,  0.84976873,  0.54401199,  0.71752816]])

In [14]: b.max(axis = 1) # 各二次元配列の行方向
Out[14]:
array([[ 0.90469703,  0.69470498,  0.84976873,  0.48029518,  0.39226259],
       [ 0.84307243,  0.55213584,  0.77007339,  0.76043728,  0.71752816]])

In [15]: b.max(axis = 2) # 各二次元配列の列方向
Out[15]:
array([[ 0.81056237,  0.59097585,  0.90469703],
       [ 0.84307243,  0.77007339,  0.71752816]])

要素の中にひとつでもNaNが含まれている場合は、NaNが最大値として返されます。 NaNを最大値として返して欲しくない場合には、nanmaxを使います。

In [21]: b = np.arange(10, dtype = np.float)

In [22]: b[3] = np.NaN # NaNを代入

In [23]: b.max()
Out[23]: nan

In [24]: np.nanmax(b) # nanmaxを使うとNaN以外の要素における最大値を返してくれる。
Out[24]: 9.0