Come utilizzare la funzione NumPy argmax() in Python
Pubblicato: 2022-09-14In questo tutorial imparerai come usare la funzione NumPy argmax() per trovare l'indice dell'elemento massimo negli array.
NumPy è una potente libreria per il calcolo scientifico in Python; fornisce array N-dimensionali che sono più performanti degli elenchi Python. Una delle operazioni comuni che esegui quando lavori con gli array NumPy è trovare il valore massimo nell'array. Tuttavia, a volte potresti voler trovare l' indice in cui si verifica il valore massimo.
La funzione argmax()
ti aiuta a trovare l'indice del massimo negli array sia unidimensionali che multidimensionali. Procediamo per imparare come funziona.
Come trovare l'indice dell'elemento massimo in una matrice NumPy
Per seguire questo tutorial, devi avere installato Python e NumPy. Puoi programmare avviando una REPL Python o avviando un notebook Jupyter.
Innanzitutto, importiamo NumPy con il solito alias np
.
import numpy as np
È possibile utilizzare la funzione NumPy max()
per ottenere il valore massimo in una matrice (facoltativamente lungo un asse specifico).
array_1 = np.array([1,5,7,2,10,9,8,4]) print(np.max(array_1)) # Output 10
In questo caso, np.max(array_1)
restituisce 10, che è corretto.
Si supponga di voler trovare l'indice a cui si verifica il valore massimo nell'array. Puoi adottare il seguente approccio in due fasi:
- Trova l'elemento massimo.
- Trova l'indice dell'elemento massimo.
In array_1
, il valore massimo di 10 si verifica all'indice 4, dopo l'indicizzazione zero. Il primo elemento è all'indice 0; il secondo elemento è all'indice 1 e così via.

Per trovare l'indice in cui si verifica il massimo, puoi utilizzare la funzione NumPy where(). np.where(condition)
restituisce un array di tutti gli indici in cui la condition
è True
.
Dovrai attingere all'array e accedere all'elemento al primo indice. Per trovare dove si verifica il valore massimo, impostiamo la condition
su array_1==10
; ricorda che 10 è il valore massimo in array_1
.
print(int(np.where(array_1==10)[0])) # Output 4
Abbiamo usato np.where()
solo con la condizione, ma questo non è il metodo consigliato per usare questa funzione.
Nota: NumPy where() Funzione :
np.where(condition,x,y)
restituisce:– Elementi da
x
quando la condizione èTrue
, e
– Elementi day
quando la condizione èFalse
.
Pertanto, concatenando le np.max()
e np.where()
, possiamo trovare l'elemento massimo, seguito dall'indice in cui si verifica.
Invece del processo in due fasi precedente, puoi utilizzare la funzione NumPy argmax() per ottenere l'indice dell'elemento massimo nell'array.
Sintassi della funzione NumPy argmax()
La sintassi generale per utilizzare la funzione NumPy argmax() è la seguente:
np.argmax(array,axis,out) # we've imported numpy under the alias np
Nella sintassi sopra:
- array è qualsiasi array NumPy valido.
- asse è un parametro opzionale. Quando si lavora con array multidimensionali, è possibile utilizzare il parametro axis per trovare l'indice di massimo lungo un asse specifico.
- out è un altro parametro opzionale. È possibile impostare il parametro
out
su un array NumPy per memorizzare l'output della funzioneargmax()
.
Nota : dalla versione NumPy 1.22.0, c'è un parametro
keepdims
aggiuntivo. Quando specifichiamo il parametroaxis
nella chiamata alla funzioneargmax()
, l'array viene ridotto lungo quell'asse. Ma l'impostazione del parametrokeepdims
suTrue
garantisce che l'output restituito abbia la stessa forma dell'array di input.
Utilizzo di NumPy argmax() per trovare l'indice dell'elemento massimo
#1 . Usiamo la funzione NumPy argmax() per trovare l'indice dell'elemento massimo in array_1
.
array_1 = np.array([1,5,7,2,10,9,8,4]) print(np.argmax(array_1)) # Output 4
La funzione argmax()
restituisce 4, che è corretto!
#2 . Se ridefiniamo array_1
in modo tale che 10 si verifichi due volte, la funzione argmax()
restituisce solo l'indice della prima occorrenza.
array_1 = np.array([1,5,7,2,10,10,8,4]) print(np.argmax(array_1)) # Output 4
Per il resto degli esempi, useremo gli elementi di array_1
che abbiamo definito nell'esempio #1.
Utilizzo di NumPy argmax() per trovare l'indice dell'elemento massimo in una matrice 2D
Rimodelliamo l'array NumPy array_1
in un array bidimensionale con due righe e quattro colonne.
array_2 = array_1.reshape(2,4) print(array_2) # Output [[ 1 5 7 2] [10 9 8 4]]
Per una matrice bidimensionale, l'asse 0 indica le righe e l'asse 1 le colonne. Gli array NumPy seguono l'indicizzazione zero . Quindi gli indici delle righe e delle colonne per l'array NumPy array_2
sono i seguenti:

Ora chiamiamo la funzione argmax()
sull'array bidimensionale, array_2
.
print(np.argmax(array_2)) # Output 4
Anche se abbiamo chiamato argmax()
sull'array bidimensionale, restituisce comunque 4. Questo è identico all'output per l'array unidimensionale, array_1
della sezione precedente.
Perché questo accade?
Questo perché non abbiamo specificato alcun valore per il parametro dell'asse. Quando questo parametro dell'asse non è impostato, per impostazione predefinita, la funzione argmax()
restituisce l'indice dell'elemento massimo lungo l'array appiattito.
Che cos'è un array appiattito? Se esiste una matrice N-dimensionale di forma d1 x d2 x … x dN , dove d1, d2, fino a dN sono le dimensioni della matrice lungo le N dimensioni, la matrice appiattita è una lunga matrice unidimensionale di dimensioni d1 * d2 * … * dN.
Per verificare come appare l'array flatten per array_2
, puoi chiamare il metodo flatten flatten()
, come mostrato di seguito:
array_2.flatten() # Output array([ 1, 5, 7, 2, 10, 9, 8, 4])
Indice dell'elemento massimo lungo le righe (asse = 0)
Procediamo a trovare l'indice dell'elemento massimo lungo le righe (asse = 0).
np.argmax(array_2,axis=0) # Output array([1, 1, 1, 1])
Questo output può essere un po' difficile da comprendere, ma capiremo come funziona.
Abbiamo impostato il parametro axis
su zero ( axis = 0
), poiché vorremmo trovare l'indice dell'elemento massimo lungo le righe. Pertanto, la funzione argmax()
restituisce il numero di riga in cui si trova l'elemento massimo, per ciascuna delle tre colonne.
Visualizziamo questo per una migliore comprensione.

Dal diagramma sopra e argmax()
, abbiamo quanto segue:
- Per la prima colonna con indice 0, il valore massimo 10 si verifica nella seconda riga, con indice = 1.
- Per la seconda colonna all'indice 1, il valore massimo 9 si verifica nella seconda riga, all'indice = 1.
- Per la terza e la quarta colonna dell'indice 2 e 3, i valori massimi 8 e 4 si trovano entrambi nella seconda riga, con indice = 1.
Questo è esattamente il motivo per cui abbiamo l' array([1, 1, 1, 1])
perché l'elemento massimo lungo le righe si trova nella seconda riga (per tutte le colonne).
Indice dell'elemento massimo lungo le colonne (asse = 1)
Quindi, utilizziamo la funzione argmax()
per trovare l'indice dell'elemento massimo lungo le colonne.
Eseguire il frammento di codice seguente e osservare l'output.
np.argmax(array_2,axis=1)
array([2, 0])
Puoi analizzare l'output?
Abbiamo impostato axis = 1
per calcolare l'indice dell'elemento massimo lungo le colonne.
La funzione argmax()
restituisce, per ogni riga, il numero di colonna in cui si verifica il valore massimo.
Ecco una spiegazione visiva:

Dal diagramma sopra e argmax()
, abbiamo quanto segue:
- Per la prima riga all'indice 0, il valore massimo 7 si verifica nella terza colonna, all'indice = 2.
- Per la seconda riga all'indice 1, il valore massimo 10 si verifica nella prima colonna, all'indice = 0.
Spero che ora tu capisca cosa significa l'output, array([2, 0])
.
Utilizzo del parametro di uscita opzionale in NumPy argmax()
È possibile utilizzare il parametro opzionale out
the nella funzione NumPy argmax() per archiviare l'output in una matrice NumPy.
Inizializza una matrice di zeri per memorizzare l'output della precedente chiamata alla funzione argmax()
– per trovare l'indice del massimo lungo le colonne ( axis= 1
).
out_arr = np.zeros((2,)) print(out_arr) [0. 0.]
Ora, rivisitiamo l'esempio di trovare l'indice dell'elemento massimo lungo le colonne ( axis = 1
) e impostiamo out
su out_arr
che abbiamo definito sopra.
np.argmax(array_2,axis=1,out=out_arr)
Vediamo che l'interprete Python genera un TypeError
, poiché out_arr
è stato inizializzato su un array di float per impostazione predefinita.
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) /usr/local/lib/python3.7/dist-packages/numpy/core/fromnumeric.py in _wrapfunc(obj, method, *args, **kwds) 56 try: ---> 57 return bound(*args, **kwds) 58 except TypeError: TypeError: Cannot cast array data from dtype('float64') to dtype('int64') according to the rule 'safe'
Pertanto, quando si imposta il parametro out
sull'array di output, è importante assicurarsi che l'array di output abbia la forma e il tipo di dati corretti. Poiché gli indici degli array sono sempre interi, è necessario impostare il parametro dtype
su int
quando si definisce l'array di output.
out_arr = np.zeros((2,),dtype=int) print(out_arr) # Output [0 0]
Ora possiamo andare avanti e chiamare la funzione argmax()
con entrambi i parametri axis
e out
, e questa volta funziona senza errori.
np.argmax(array_2,axis=1,out=out_arr)
È ora possibile accedere all'output della funzione argmax()
nell'array out_arr
.
print(out_arr) # Output [2 0]
Conclusione
Spero che questo tutorial ti abbia aiutato a capire come usare la funzione NumPy argmax(). È possibile eseguire gli esempi di codice in un notebook Jupyter.
Rivediamo ciò che abbiamo imparato.
- La funzione NumPy argmax() restituisce l'indice dell'elemento massimo in una matrice. Se l'elemento massimo ricorre più di una volta in un array a , np.argmax(a) restituisce l'indice della prima occorrenza dell'elemento.
- Quando si lavora con matrici multidimensionali, è possibile utilizzare il parametro dell'asse facoltativo per ottenere l'indice dell'elemento massimo lungo un asse particolare. Ad esempio, in un array bidimensionale: impostando axis = 0 e axis = 1 , puoi ottenere l'indice dell'elemento massimo lungo rispettivamente le righe e le colonne.
- Se desideri archiviare il valore restituito in un altro array, puoi impostare il parametro out opzionale sull'array di output. Tuttavia, l'array di output deve essere di forma e tipo di dati compatibili.
Quindi, dai un'occhiata alla guida approfondita sui set Python.