Anzahl Max vs Amax vs Maximum

132

numpy hat drei verschiedene Funktionen, die anscheinend für die gleichen Dinge verwendet werden können - außer dass numpy.maximumsie nur elementweise verwendet werden können, während numpy.maxund numpy.amaxauf bestimmten Achsen oder allen Elementen verwendet werden können. Warum gibt es mehr als nur numpy.max? Gibt es eine gewisse Subtilität in der Leistung?

(Ähnlich für minvs. aminvs. minimum)

DilithiumMatrix
quelle

Antworten:

164

np.maxist nur ein Alias ​​für np.amax. Diese Funktion funktioniert nur für ein einzelnes Eingabearray und ermittelt den Wert des maximalen Elements in diesem gesamten Array (Rückgabe eines Skalars). Alternativ wird ein axisArgument verwendet und der Maximalwert entlang einer Achse des Eingabearrays ermittelt (wobei ein neues Array zurückgegeben wird).

>>> 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])

Das Standardverhalten von np.maximumbesteht darin, zwei Arrays zu verwenden und ihr elementweises Maximum zu berechnen. Hier bedeutet "kompatibel", dass ein Array an das andere gesendet werden kann. Beispielsweise:

>>> b = np.array([3, 6, 1])
>>> c = np.array([4, 2, 9])
>>> np.maximum(b, c)
array([4, 6, 9])

Es np.maximumist aber auch eine universelle Funktion, was bedeutet, dass es andere Funktionen und Methoden hat, die bei der Arbeit mit mehrdimensionalen Arrays nützlich sind. Beispielsweise können Sie das kumulative Maximum über ein Array (oder eine bestimmte Achse des Arrays) berechnen:

>>> d = np.array([2, 0, 3, -4, -2, 7, 9])
>>> np.maximum.accumulate(d)
array([2, 2, 3, 3, 3, 7, 9])

Dies ist mit nicht möglich np.max.

Sie können bis zu einem gewissen Grad np.maximumnachahmen np.max, wenn Sie Folgendes verwenden np.maximum.reduce:

>>> np.maximum.reduce(d)
9
>>> np.max(d)
9

Grundlegende Tests legen nahe, dass die beiden Ansätze in ihrer Leistung vergleichbar sind. und sie sollten es sein, wie np.max()tatsächlich Aufrufenp.maximum.reduce zur Berechnung.

Alex Riley
quelle
1
Vielen Dank. Offensichtlich kann man amaxfür den gleichen (Wurzel-) Zweck verwenden maximum, dh mit numpy.amax([a1, a2], axis=0)---, aber ist dies nicht so optimiert für dieses Verhalten wie numpy.maximum? In ähnlicher Weise schließen die hinzugefügten Feinheiten von numpy.amax(z. B. dem axisParameter) aus, dass es ein ist ufunc?
DilithiumMatrix
1
Das ist richtig, amaxist hier nicht für den elementweisen Vergleich optimiert - jede Eingabe muss ein Numpy-Array sein, damit die Liste vor dem Ausführen der Operation konvertiert wird (vorausgesetzt, die beiden Formen waren gleich). Die Dokumente amaxsagen ausdrücklich, dass dies maximumhier schneller ist.
Alex Riley
Zur zweiten Frage: Ich denke, man amax könnte sie zu einem Ufunc machen, obwohl der Hauptzweck von Ufuncs darin besteht, Operationen zwischen Arrays zu übertragen. Es scheint wenig notwendig zu sein, maxeinen unären Ufunc zu machen . Ich denke, amaxexistierte, bevor Ufuncs wirklich eine Sache waren (es kam von numerischen, NumPys Eltern), also wird es auch für die Nachwelt aufbewahrt.
Alex Riley
Hier maximum.reduce wird für die Leistung bevorzugt: 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.[...]
Tom Hale
1
@ TomHale: Ich denke, dass sich die Dokumentation eher auf die in Python integrierte max()Funktion bezieht als auf numpy.max(), aber es ist definitiv erwähnenswert, dass Python max()langsamer ist.
Alex Riley
21

Sie haben bereits angegeben, warum dies np.maximumanders ist - es wird ein Array zurückgegeben, das das elementweise Maximum zwischen zwei Arrays darstellt.

Wie für np.amaxund np.max: beide rufen dieselbe Funktion auf - np.maxist nur ein Alias ​​für np.amaxund sie berechnen das Maximum aller Elemente in einem Array oder entlang einer Achse eines Arrays.

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>
tmdavison
quelle
2
Ich fühle mich jetzt dumm, ich habe es from numpy import max as np_maxnur getan , um Konflikte mit dem Generikum zu vermeiden, maxwährend ich nur amax Häute hätte benutzen können .
Bas Jansen
8

Der Vollständigkeit halber gibt es in Numpy vier maximal verwandte Funktionen. Sie fallen in zwei verschiedene Kategorien:

  • np.amax/np.max, np.nanmax: für Statistiken zur Reihenfolge einzelner Arrays
  • und np.maximum, np.fmaxdenn elementweisen Vergleich von zwei Arrays

I. Für Statistiken zur Reihenfolge einzelner Arrays

NaNs Propagator np.amax/np.maxund sein ignorantes Gegenstück zu NaN np.nanmax.

  • np.maxist nur ein Alias ​​von np.amax, daher werden sie als eine Funktion betrachtet.

    >>> np.max.__name__
    'amax'
    >>> np.max is np.amax
    True
  • np.maxvermehrt NaNs, während np.nanmaxNaNs ignoriert werden.

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

II. Zum elementweisen Vergleich zweier Arrays

NaNs Propagator np.maximumund sein ignorantes Gegenstück zu NaNs np.fmax.

  • Beide Funktionen erfordern zwei Arrays als die ersten beiden Positionsargumente, mit denen verglichen werden soll.

    # x1 and x2 must be the same shape or can be broadcast
    np.maximum(x1, x2, /, ...);
    np.fmax(x1, x2, /, ...)
  • np.maximumvermehrt NaNs, während np.fmaxNaNs ignoriert werden.

    >>> 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])
  • Die elementweisen Funktionen sind np.ufunc( Universal Function ) , was bedeutet, dass sie einige spezielle Eigenschaften haben, die die normale Numpy-Funktion nicht hat.

    >>> type(np.maximum)
    <class 'numpy.ufunc'>
    >>> type(np.fmax)
    <class 'numpy.ufunc'>
    >>> #---------------#
    >>> type(np.max)
    <class 'function'>
    >>> type(np.nanmax)
    <class 'function'>

Und schließlich gelten für die vier Mindestfunktionen dieselben Regeln :

  • np.amin/np.min, np.nanmin;
  • und np.minimum, np.fmin.
YaOzI
quelle
0

np.maximum vergleicht nicht nur elementweise, sondern auch Array elementweise mit einem einzelnen Wert

>>>np.maximum([23, 14, 16, 20, 25], 18)
array([23, 18, 18, 20, 25])
Shivaraj Karki
quelle