numpyには3つの異なる関数がありますが、numpy.maximum
はのみが要素ごとに使用できますが、numpy.max
は同じ目的で使用できるようです。 numpy.amax
は特定の軸、またはすべての要素で使用できます。なぜnumpy.max
だけではないのですか?これにパフォーマンスの微妙な点はありますか?
(min
対amin
対minimum
も同様)
np.max
はnp.amax
の単なるエイリアスです。この関数は、単一の入力配列に対してのみ機能し、その配列全体の最大要素の値を見つけます(スカラを返します)。あるいは、axis
引数を取り、入力配列の軸に沿って最大値を見つけます(新しい配列を返します)。
>>> a = np.array([[0, 1, 6],
[2, 4, 1]])
>>> np.max(a)
6
>>> np.max(a, axis=0) # max of each column
array([2, 4, 6])
np.maximum
のデフォルトの振る舞いは、2つの配列を取り、それらの要素毎の最大値を計算することです。ここで、「互換性がある」とは、一方のアレイを他方のアレイにブロードキャストできることを意味します。例えば:
>>> b = np.array([3, 6, 1])
>>> c = np.array([4, 2, 9])
>>> np.maximum(b, c)
array([4, 6, 9])
しかしnp.maximum
は niversal function でもあり、多次元配列を扱うときに役立つ他の機能やメソッドがあります。たとえば、配列(または配列の特定の軸)の累積最大値を計算できます。
>>> d = np.array([2, 0, 3, -4, -2, 7, 9])
>>> np.maximum.accumulate(d)
array([2, 2, 3, 3, 3, 7, 9])
これはnp.max
では不可能です。
np.maximum
を使用する場合、np.max
をある程度np.maximum.reduce
に似せることができます。
>>> np.maximum.reduce(d)
9
>>> np.max(d)
9
基本的なテストでは、2つの方法はパフォーマンスが似通っています。 np.max()
は実際にはnp.maximum.reduce
を使って計算を行います。
np.maximum
が異なる理由はすでに述べました。2つの配列のうち、要素ごとに最大の配列を返します。
np.amax
とnp.max
に関しては、どちらも同じ関数を呼び出します - np.max
はnp.amax
の単なる別名で、配列内のすべての要素の最大値、または配列の軸に沿って計算します。
In [1]: import numpy as np
In [2]: np.amax
Out[2]: <function numpy.core.fromnumeric.amax>
In [3]: np.max
Out[3]: <function numpy.core.fromnumeric.amax>
完全を期すために、Numpyには4つの最大関連関数があります。それらは2つの異なるカテゴリに分類されます。
np.amax/np.max
、np.nanmax
:単一配列に対する順序統計np.maximum
、np.fmax
:2つの配列の要素ごとの比較用NaNsプロパゲータnp.amax/np.max
およびそのNaN無知対応物np.nanmax
。
np.max
はnp.amax
の単なるエイリアスであるため、それらは1つの関数と見なされます。
>>> np.max.__name__
'amax'
>>> np.max is np.amax
True
np.max
はNaNを伝播し、np.nanmax
はNaNを無視します。
>>> np.max([np.nan, 3.14, -1])
nan
>>> np.nanmax([np.nan, 3.14, -1])
3.14
NaNsプロパゲータnp.maximum
とそれに対応するNaNs無知の対応物np.fmax
。
どちらの関数も、比較する最初の2つの位置引数として2つの配列を必要とします。
# x1 and x2 must be the same shape or can be broadcast
np.maximum(x1, x2, /, ...);
np.fmax(x1, x2, /, ...)
np.maximum
はNaNを伝播し、np.fmax
はNaNを無視します。
>>> np.maximum([np.nan, 3.14, 0], [np.NINF, np.nan, 2.72])
array([ nan, nan, 2.72])
>>> np.fmax([np.nan, 3.14, 0], [np.NINF, np.nan, 2.72])
array([-inf, 3.14, 2.72])
要素ごとの関数は np.ufunc
(ユニバーサル関数) です。つまり、通常のNumpy関数にはない特別な性質があります。持ってない.
>>> type(np.maximum)
<class 'numpy.ufunc'>
>>> type(np.fmax)
<class 'numpy.ufunc'>
>>> #---------------#
>>> type(np.max)
<class 'function'>
>>> type(np.nanmax)
<class 'function'>
そして最後に、同じ規則が4つの最小関連関数にも適用されます。
np.amin/np.min
、np.nanmin
;np.minimum
、np.fmin
。