numpy max vs amax vs maximum


132

numpyには、同じものに使用できるように見える3つの異なる関数があります--- numpy.maximumことができますのみながら、要素ごとの使用するnumpy.maxnumpy.amax、特定の軸、またはすべての要素で使用することができます。なぜそれ以上のものがあるのnumpy.maxですか?これにはパフォーマンスの微妙な点はありますか?

(同様に min vs. aminに対してminimum

回答:


164

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に計算を行うために呼び出されるように、そうあるべきです。


1
ありがとう。明らかamaxに、同じ(ルート)目的でmaximum、つまりnumpy.amax([a1, a2], axis=0)--- を使用できますが、これはこの動作に対して最適化されていませんnumpy.maximumか?同様に、追加された機能numpy.amax(たとえばaxisパラメーター)は、それがaであることを妨げufuncますか?
DilithiumMatrix 2015年

1
そうですamax、これは要素ごとの比較のために最適化されていません-どの入力もNumpy配列である必要があるため、操作が実行される前にリストが変換されます(2つの形状が同じであると想定)。特にのドキュメントamaxmaximumは、こちらの方が速いとしています。
Alex Riley

2番目の質問について:ufuncの主な目的は、操作を配列間でブロードキャストできるようにするamax ことです、ufunc にすることができると思います。max単項ufunc を作成する必要はほとんどないようです。私はamaxufuncsが本当に物になる前に存在していたと思います(それはNumPyの親である数値から来ました)ので、後世のために残されています。
Alex Riley、

ここでは 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.[...]
トム・ヘイル

1
@TomHale:ドキュメントはではmax()なくPython組み込み関数を参照していると思いますがnumpy.max()、Pythonの方max()が遅いことを指摘する価値はあります。
Alex Riley、

21

なぜnp.maximum違うのかはすでに説明しました。2つの配列間の要素ごとの最大値である配列を返します。

np.amaxand については、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>

2
今はバカな気がします。from numpy import max as np_max単にジェネリックとの競合を避けるためだけに行っていたのですが、非表示をmax使用することもできました。amax
Bas Jansen

8

完全を期すために、Numpyには4つの最大関連関数があります。それらは2つの異なるカテゴリに分類されます。

  • np.amax/np.maxnp.nanmax単一配列の場合順序統計
  • and np.maximumnp.fmax2つの配列の要素ごとの比較

I. のために単一のアレイ順序統計

NaNs伝播np.amax/np.max関数とそのNaN無知な対応物np.nanmax

  • np.maxはの単なるエイリアスでnp.amaxあるため、1つの関数と見なされます。

    >>> np.max.__name__
    'amax'
    >>> np.max is np.amax
    True
  • np.maxNaNをnp.nanmax無視しながら、NaNを伝播します。

    >>> np.max([np.nan, 3.14, -1])
    nan
    >>> np.nanmax([np.nan, 3.14, -1])
    3.14

II。2つの配列の要素ごとの比較

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.maximumNaNを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.ufuncUniversal 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.minnp.nanmin;
  • そしてnp.minimumnp.fmin

0

np.maximum 要素ごとに比較するだけでなく、配列ごとに単一の値と比較します

>>>np.maximum([23, 14, 16, 20, 25], 18)
array([23, 18, 18, 20, 25])
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.