numpyには、同じものに使用できるように見える3つの異なる関数があります--- numpy.maximum
ことができますのみながら、要素ごとの使用するnumpy.max
とnumpy.amax
、特定の軸、またはすべての要素で使用することができます。なぜそれ以上のものがあるのnumpy.max
ですか?これにはパフォーマンスの微妙な点はありますか?
(同様に min
vs. amin
に対してminimum
)
numpyには、同じものに使用できるように見える3つの異なる関数があります--- numpy.maximum
ことができますのみながら、要素ごとの使用するnumpy.max
とnumpy.amax
、特定の軸、またはすべての要素で使用することができます。なぜそれ以上のものがあるのnumpy.max
ですか?これにはパフォーマンスの微妙な点はありますか?
(同様に min
vs. 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つの配列を取り、要素ごとの最大値を計算することです。ここで、「互換性がある」とは、1つのアレイを他のアレイにブロードキャストできることを意味します。例えば:
>>> b = np.array([3, 6, 1])
>>> c = np.array([4, 2, 9])
>>> np.maximum(b, c)
array([4, 6, 9])
しかしnp.maximum
、これは汎用関数でもあります。つまり、多次元配列を操作するときに役立つ他の機能やメソッドがあるということです。たとえば、配列(または配列の特定の軸)の累積最大値を計算できます。
>>> 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
に計算を行うために呼び出されるように、そうあるべきです。
amax
、これは要素ごとの比較のために最適化されていません-どの入力もNumpy配列である必要があるため、操作が実行される前にリストが変換されます(2つの形状が同じであると想定)。特にのドキュメントamax
でmaximum
は、こちらの方が速いとしています。
amax
ことですが、ufunc にすることができると思います。max
単項ufunc を作成する必要はほとんどないようです。私はamax
ufuncsが本当に物になる前に存在していたと思います(それはNumPyの親である数値から来ました)ので、後世のために残されています。
maximum.reduce
、パフォーマンスのために好ましい:The Python function max() will find the maximum over a one-dimensional array, but it will do so using a slower sequence interface. The reduce method of the maximum ufunc is much faster. Also, the max() method will not give answers you might expect for arrays with greater than one dimension.
[...]
max()
なくPython組み込み関数を参照していると思いますがnumpy.max()
、Pythonの方max()
が遅いことを指摘する価値はあります。
なぜnp.maximum
違うのかはすでに説明しました。2つの配列間の要素ごとの最大値である配列を返します。
np.amax
and については、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>
from numpy import max as np_max
単にジェネリックとの競合を避けるためだけに行っていたのですが、非表示をmax
使用することもできました。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
(Universal Function)です。つまり、これらの関数には、通常の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
。
amax
に、同じ(ルート)目的でmaximum
、つまりnumpy.amax([a1, a2], axis=0)
--- を使用できますが、これはこの動作に対して最適化されていませんnumpy.maximum
か?同様に、追加された機能numpy.amax
(たとえばaxis
パラメーター)は、それがaであることを妨げufunc
ますか?