2015-11-06 11 views
31

numpy ma trzy różne funkcje, które wydawać się mogą one być wykorzystywane do tych samych rzeczy --- chyba że numpy.maximum może tylko być stosowany element mądry, a numpy.max i numpy.amax mogą być wykorzystywane na szczególnie osie lub wszystkie elementy. Dlaczego jest więcej niż tylko numpy.max? Czy jest w tym pewna subtelność?numpy max vs Amax vs maksymalnej

(Podobnie dla min vs. amin vs. minimum)

Odpowiedz

37

np.max tylko aliasem np.amax. Ta funkcja działa tylko na jednej macierzy wejściowej pojedynczej i znajduje wartość maksymalnego elementu w całej tablicy (zwracając skalar). Alternatywnie, pobiera argument o wartości axis i znajduje 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ślne zachowanie np.maximum jest podjęcie dwa tablice i obliczyć ich element mądry maksimum. W tym przypadku "zgodny" oznacza, że ​​jedna tablica 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.maximum również universal function co oznacza, że ​​ma inne właściwości i metod, które się przydać podczas pracy z wielowymiarowych tablic. Dla przykładu można obliczyć skumulowaną maksymalną nad tablicy (albo z 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 możliwe np.max.

Można dokonać np.maximum naśladować np.max do pewnego stopnia podczas korzystania np.maximum.reduce:

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

badania podstawowe sugeruje dwa podejścia są porównywalne pod względem wydajności.

+1

Dzięki. Oczywiście można użyć 'amax' dla tego samego (root) celu jak' maksimum', tj. Z 'numpy.amax ([a1, a2], axis = 0)' --- ale czy nie jest to tak zoptymalizowane dla tego zachowania, jak "numpy.maximum"? Podobnie, dodana nicetia z 'numpy.amax' (np. Parametr' axis') wyklucza to, że jest 'ufunc'? – DilithiumMatrix

+0

To prawda, 'amax' nie jest zoptymalizowany pod względem porównania elementów w tym - każde wejście musi być tablicą Numpy, tak aby lista była konwertowana przed uruchomieniem operacji (zakładając, że dwa kształty były takie same). Dokumenty "amax" wyraźnie mówią, że "maksimum" jest tutaj szybsze. –

+0

Na drugie pytanie: domyślam się, że 'amax' * może * zostać przekształcone w ufunc, chociaż głównym celem ufuncs jest umożliwienie transmisji operacji pomiędzy tablicami. Wydaje się, że nie ma potrzeby, aby "max" był unariennym ufunc. Myślę, że 'amax' istniał przed tym, jak ufuncs były naprawdę rzeczą (pochodziło z numerycznego, rodzica NumPy), więc jest również przechowywane dla potomności. –

6

Już stwierdzić dlaczego np.maximum jest inny - zwraca tablicę, która jest maksymalny element mądry między dwiema tablicami.

chodzi np.amax i np.max: obie wywołać taką samą funkcję - np.max tylko alias np.amax, i obliczenie maksimum wszystkich elementów w szeregu, 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>