numpy max vs amax vs maximum

132

numpy ma trzy różne funkcje, które wydają się być używane do tych samych rzeczy - z wyjątkiem tego, że numpy.maximummogą być używane tylko w odniesieniu do elementów, podczas gdy numpy.maxi numpy.amaxmogą być używane na określonych osiach lub wszystkich elementach. Dlaczego jest coś więcej niż tylko numpy.max? Czy jest w tym coś subtelnego w wykonaniu?

(Podobnie dla minvs. aminvs. minimum)

DilithiumMatrix
źródło

Odpowiedzi:

164

np.maxjest tylko aliasem dla np.amax. Ta funkcja działa tylko na pojedynczej tablicy wejściowej i znajduje wartość maksymalnego elementu w całej tablicy (zwraca wartość skalarną). Alternatywnie, pobiera axisargument i znajdzie maksymalną wartość wzdłuż osi tablicy wejściowej (zwracając nową tablicę).

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

Domyślnym zachowaniem programu np.maximumjest pobranie dwóch tablic i obliczenie ich maksimum pod względem elementów. Tutaj „kompatybilny” oznacza, że ​​jedna macierz może być transmitowana do drugiej. Na przykład:

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

Ale np.maximumjest również funkcją uniwersalną, co oznacza, że ​​ma inne cechy i metody, które przydają się podczas pracy z wielowymiarowymi tablicami. Na przykład możesz obliczyć skumulowane maksimum na tablicy (lub określonej osi tablicy):

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

Nie jest to możliwe w przypadku np.max.

Możesz do pewnego stopnia np.maximumnaśladować, np.maxużywając np.maximum.reduce:

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

Podstawowe testy sugerują, że te dwa podejścia są porównywalne pod względem wydajności; i powinny być, tak jak w np.max()rzeczywistości wzywanp.maximum.reduce do wykonania obliczeń.

Alex Riley
źródło
1
Dzięki. Oczywiście można użyć amaxtego samego (głównego) celu, jak maximumnp. Z numpy.amax([a1, a2], axis=0)---, ale czy nie jest to tak zoptymalizowane pod kątem tego zachowania, jak numpy.maximum? Podobnie, czy dodane dodatki numpy.amax(np. axisParametr) uniemożliwiają mu bycie a ufunc?
DilithiumMatrix
1
Zgadza się, amaxnie jest zoptymalizowany pod kątem porównania elementów w tym - wszelkie dane wejściowe będą musiały być tablicą Numpy, aby lista została przekonwertowana przed uruchomieniem operacji (zakładając, że dwa kształty były takie same). Dokumenty amaxspecjalnie podają, że maximumjest tu szybciej.
Alex Riley
Odnośnie drugiego pytania: wydaje mi się, że amax można by go przekształcić w ufunc, chociaż głównym celem ufuncs jest umożliwienie transmisji operacji między tablicami. Wydaje się, że nie ma potrzeby tworzenia maxjednoargumentowego ufunc. Myślę, że amaxistniało zanim ufuncs naprawdę było czymś (pochodzi od numeric, rodzic NumPy), więc jest również zachowane dla potomności.
Alex Riley
Oto maximum.reduce preferowane wykonanie: 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: Myślę, że dokumentacja odnosi się do funkcji wbudowanej w Pythonie max(), a nie numpy.max(), ale zdecydowanie warto zauważyć, że Python max()jest wolniejszy.
Alex Riley,
21

Powiedziałeś już, dlaczego np.maximumjest inny - zwraca tablicę, która jest maksymalnym elementem między dwiema tablicami.

Jeśli chodzi o np.amaxi np.max: obaj wywołują tę samą funkcję - np.maxjest po prostu aliasem np.amaxi obliczają maksimum wszystkich elementów w tablicy lub wzdłuż osi tablicy.

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
źródło
2
Czuję się teraz głupio, robiłem to from numpy import max as np_maxtylko po to, żeby przez maxcały czas unikać konfliktu z generycznym, podczas gdy mogłem po prostu używać amax skór .
Bas Jansen
8

Aby uzyskać kompletność, w Numpy istnieją cztery maksymalne powiązane funkcje. Można je podzielić na dwie różne kategorie:

  • np.amax/np.max, np.nanmax: dla statystyki kolejności pojedynczych tablic
  • a np.maximum, np.fmaxbo mądry element porównywania dwóch tablic

I. Na jednej tablicy statystyk porządkowych

Propagator NaNs np.amax/np.maxi jego ignorancki odpowiednik NaN np.nanmax.

  • np.maxjest po prostu aliasem np.amax, więc są traktowane jako jedna funkcja.

    >>> np.max.__name__
    'amax'
    >>> np.max is np.amax
    True
  • np.maxpropaguje NaN, np.nanmaxignorując NaN.

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

II. Do porównania elementów dwóch tablic

Propagator NaNs np.maximumi jego ignorancki odpowiednik np.fmax.

  • Obie funkcje wymagają dwóch tablic jako pierwszych dwóch argumentów pozycyjnych do porównania.

    # x1 and x2 must be the same shape or can be broadcast
    np.maximum(x1, x2, /, ...);
    np.fmax(x1, x2, /, ...)
  • np.maximumpropaguje NaN, np.fmaxignorując 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])
  • Funkcje elementarne to np.ufunc( Universal Function ) , co oznacza, że ​​mają pewne specjalne właściwości, których normalna funkcja Numpy nie ma.

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

I wreszcie, te same zasady dotyczą czterech minimalnych powiązanych funkcji:

  • np.amin/np.min, np.nanmin;
  • i np.minimum, np.fmin.
YaOzI
źródło
0

np.maximum nie tylko porównuje elementarnie, ale także porównuje elementarnie tablicę z pojedynczą wartością

>>>np.maximum([23, 14, 16, 20, 25], 18)
array([23, 18, 18, 20, 25])
shivaraj karki
źródło