intorpidimento max vs amax vs massimo


132

numpy ha tre diverse funzioni che sembrano poter essere usate per le stesse cose --- tranne che numpy.maximumpuò essere usato solo dal punto di vista degli elementi, mentre numpy.maxe numpy.amaxpuò essere usato su particolari assi, o su tutti gli elementi. Perché c'è di più che solo numpy.max? C'è qualche sottigliezza in questo nelle prestazioni?

(Allo stesso modo per minvs. aminvs. minimum)

Risposte:


164

np.maxè solo un alias per np.amax. Questa funzione funziona solo su un singolo array di input e trova il valore dell'elemento massimo nell'intero array (restituendo uno scalare). In alternativa, accetta un axisargomento e trova il valore massimo lungo un asse dell'array di input (restituendo un nuovo array).

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

Il comportamento predefinito di np.maximumè prendere due matrici e calcolare il massimo degli elementi. Qui, "compatibile" significa che un array può essere trasmesso all'altro. Per esempio:

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

Ma np.maximumè anche una funzione universale, il che significa che ha altre caratteristiche e metodi che risultano utili quando si lavora con array multidimensionali. Ad esempio, è possibile calcolare il massimo cumulativo su un array (o un asse particolare dell'array):

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

Questo non è possibile con np.max.

Puoi np.maximumimitare np.maxin una certa misura quando usi np.maximum.reduce:

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

Test di base suggeriscono che i due approcci sono comparabili nelle prestazioni; e dovrebbero essere, come in np.max()realtà chiamanp.maximum.reduce per fare il calcolo.


1
Grazie. Ovviamente si può usare amaxper lo stesso scopo (root) di maximum, cioè con numpy.amax([a1, a2], axis=0)--- ma questo non è ottimizzato per questo comportamento come numpy.maximum? Allo stesso modo, le bellezze aggiunte di numpy.amax(ad esempio il axisparametro) impediscono che sia un ufunc?
DilithiumMatrix,

1
Esatto, amaxnon è ottimizzato per un confronto in termini di elementi in questo - qualsiasi input dovrà essere un array Numpy, quindi l'elenco verrà convertito prima che l'operazione venga eseguita (supponendo che le due forme fossero uguali). I documenti per amaxspecificamente dicono che maximumqui è più veloce.
Alex Riley,

Sulla seconda domanda: immagino che amax potrebbe essere trasformato in un ufunc, sebbene lo scopo principale di ufuncs sia quello di consentire alle operazioni di essere trasmesse tra array. Sembra che non ci sia bisogno di fare maxun ufunc unario. Penso che amaxesistesse prima che gli ufunc fossero davvero una cosa (proveniva da un genitore numerico, NumPy), quindi è mantenuto anche per i posteri.
Alex Riley,

Qui maximum.reduce è preferito per l'esecuzione: 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: Penso che la documentazione si riferisca alla max()funzione integrata di Python , piuttosto che numpy.max(), ma vale sicuramente la pena sottolineare che il Python max()è più lento.
Alex Riley,

21

Hai già affermato perché np.maximumè diverso: restituisce un array che rappresenta il massimo in termini di elementi tra due array.

Per quanto riguarda np.amaxe np.max: entrambi chiamano la stessa funzione - np.maxè solo un alias per np.amaxe calcolano il massimo di tutti gli elementi in un array o lungo un asse di un array.

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
Mi sento stupido ora, stavo facendo from numpy import max as np_maxsolo per evitare conflitti con il generico per maxtutto il tempo mentre avrei potuto usare solo le amax pelli .
Bas Jansen,

8

Per completezza, in Numpy ci sono quattro funzioni correlate massime . Si dividono in due diverse categorie:

  • np.amax/np.max, np.nanmax: per le statistiche dell'ordine di array singolo
  • e np.maximum, np.fmaxper un confronto in termini di elementi di due array

I. Per statistiche sull'ordine di array singolo

Propagatore NaNs np.amax/np.maxe sua controparte ignorante NaN np.nanmax.

  • np.maxè solo un alias di np.amax, quindi sono considerati come una funzione.

    >>> np.max.__name__
    'amax'
    >>> np.max is np.amax
    True
  • np.maxpropaga NaN mentre np.nanmaxignora le NaN.

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

II. Per un confronto tra elementi di due array

Propagatore di NaN np.maximume controparte ignorante dei suoi NaN np.fmax.

  • Entrambe le funzioni richiedono due array come i primi due argomenti posizionali con cui confrontare.

    # x1 and x2 must be the same shape or can be broadcast
    np.maximum(x1, x2, /, ...);
    np.fmax(x1, x2, /, ...)
  • np.maximumpropaga NaN mentre np.fmaxignora le 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])
  • Le funzioni per quanto riguarda gli elementi sono np.ufunc( Funzione universale ) , il che significa che hanno alcune proprietà speciali che la normale funzione Numpy non ha.

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

E infine, le stesse regole si applicano alle quattro funzioni minime correlate:

  • np.amin/np.min, np.nanmin;
  • e np.minimum, np.fmin.

0

np.maximum non solo confronta elementally ma confronta anche array elementwise con valore singolo

>>>np.maximum([23, 14, 16, 20, 25], 18)
array([23, 18, 18, 20, 25])
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.