In questa guida, esploreremo come utilizzare la funzione argmax()
di NumPy per individuare l’indice del valore più grande all’interno di array.
NumPy è una libreria fondamentale in Python per il calcolo scientifico. Offre array N-dimensionali che superano le prestazioni delle liste standard di Python. Una delle operazioni comuni con gli array NumPy è la ricerca del valore massimo. Tuttavia, spesso è necessario identificare l’indice in cui tale valore massimo si manifesta.
La funzione argmax()
è lo strumento perfetto per questo, permettendo di trovare l’indice del massimo in array sia unidimensionali che multidimensionali. Andiamo a scoprire il suo funzionamento.
Come Trovare l’Indice del Massimo in un Array NumPy
Per seguire questo tutorial, assicurati di avere Python e NumPy installati. Puoi utilizzare un ambiente REPL di Python o un notebook Jupyter per scrivere il codice.
Iniziamo importando NumPy, solitamente con l’alias np
:
import numpy as np
Per ottenere il valore massimo di un array, si può usare la funzione max()
di NumPy, eventualmente specificando un asse:
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, il valore corretto.
Ora, supponiamo di voler sapere l’indice dove si trova questo valore massimo. Possiamo procedere in due fasi:
- Determinare l’elemento massimo.
- Trovare l’indice di tale elemento.
Nell’array array_1
, il valore massimo 10 è all’indice 4 (considerando l’indicizzazione a base zero: il primo elemento ha indice 0, il secondo 1, e così via).
Per identificare l’indice del massimo, si può utilizzare la funzione where()
di NumPy. np.where(condizione)
restituisce un array di indici dove la condizione è vera.
Per trovare la posizione del massimo, impostiamo la condizione array_1==10
(ricordando che 10 è il massimo di array_1
):
print(int(np.where(array_1==10)[0])) # Output 4
Anche se abbiamo usato np.where()
con una sola condizione, questo non è il modo più corretto di usare questa funzione.
📌 Nota: Funzione where()
di NumPy:np.where(condizione, x, y)
restituisce:
- Elementi da
x
se la condizione è vera, e - Elementi da
y
se la condizione è falsa.
Quindi, concatenando np.max()
e np.where()
, potremmo individuare l’elemento massimo e poi il suo indice.
Per semplificare, invece del processo in due fasi, possiamo usare la funzione argmax()
di NumPy, che restituisce direttamente l’indice del valore massimo nell’array.
Sintassi della Funzione argmax()
di NumPy
La sintassi di base della funzione argmax()
di NumPy è:
np.argmax(array, axis, out) # numpy è importato con alias np
Nella sintassi sopra:
array
è un array NumPy valido.axis
è un parametro opzionale. In array multidimensionali, si usaaxis
per trovare l’indice del massimo lungo un determinato asse.out
è un altro parametro opzionale. Permette di specificare un array dove memorizzare il risultato diargmax()
.
Nota: Dalla versione NumPy 1.22.0, è stato aggiunto un parametro keepdims
. Quando si specifica axis
in argmax()
, l’array si riduce lungo quell’asse. Impostando keepdims
a True
, l’output manterrà la stessa forma dell’array di input.
Utilizzare argmax()
di NumPy per Trovare l’Indice del Massimo
#1. Utilizziamo argmax()
per trovare l’indice del massimo in array_1
.
array_1 = np.array([1,5,7,2,10,9,8,4]) print(np.argmax(array_1)) # Output 4
argmax()
restituisce 4, che è corretto! ✅
#2. Se ridefiniamo array_1
con due occorrenze del valore 10, argmax()
restituirà 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 i prossimi esempi, useremo la versione originale di array_1
dell’esempio #1.
Utilizzo di argmax()
in Array 2D
Trasformiamo l’array 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]]
In una matrice 2D, l’asse 0 rappresenta le righe e l’asse 1 le colonne. Gli array NumPy usano l’indicizzazione a base zero.
Ora, chiamiamo argmax()
sull’array array_2
.
print(np.argmax(array_2)) # Output 4
Anche se argmax()
è stato applicato a un array 2D, il risultato è comunque 4, lo stesso dell’array 1D.
Perché? 🤔
Questo succede perché non abbiamo specificato l’asse. Senza specificare l’asse, argmax()
restituisce l’indice del massimo nell’array *appiattito*.
Un array appiattito è una rappresentazione unidimensionale di un array N-dimensionale, ottenuta concatenando le righe o le colonne. La forma dell’array appiattito è data dal prodotto delle dimensioni dell’array originale.
Per verificare l’aspetto dell’array appiattito di array_2
, usiamo il metodo flatten()
:
array_2.flatten() # Output array([ 1, 5, 7, 2, 10, 9, 8, 4])
Indice del Massimo Lungo le Righe (axis=0
)
Ora, troviamo l’indice del massimo lungo le righe (asse = 0).
np.argmax(array_2,axis=0) # Output array([1, 1, 1, 1])
Questo output potrebbe sembrare non intuitivo, ma analizziamolo.
Abbiamo impostato axis
a zero per trovare l’indice del massimo *per ogni colonna*. Quindi, argmax()
restituisce il numero di *riga* in cui si trova il massimo in ogni colonna.
Dal diagramma e dall’output, possiamo vedere:
- Nella prima colonna (indice 0), il massimo 10 è nella riga 2 (indice 1).
- Nella seconda colonna (indice 1), il massimo 9 è nella riga 2 (indice 1).
- Nelle colonne di indice 2 e 3, i massimi 8 e 4 sono entrambi nella riga 2 (indice 1).
Ecco perché l’output è array([1, 1, 1, 1])
, indicando che il massimo lungo le righe si trova nella seconda riga per tutte le colonne.
Indice del Massimo Lungo le Colonne (axis=1
)
Ora usiamo argmax()
per trovare l’indice del massimo lungo le colonne.
np.argmax(array_2,axis=1) # Output array([2, 0])
L’output è ora più chiaro?
Abbiamo impostato axis=1
per calcolare l’indice del massimo *per ogni riga*. In questo caso, argmax()
restituisce per ogni riga, il numero di *colonna* in cui si trova il massimo.
Dal diagramma e dall’output possiamo osservare:
- Nella prima riga (indice 0), il massimo 7 è nella terza colonna (indice 2).
- Nella seconda riga (indice 1), il massimo 10 è nella prima colonna (indice 0).
Spero che ora tu capisca cosa significa l’output array([2, 0])
.
Utilizzo del Parametro Opzionale out
Il parametro opzionale out
in argmax()
permette di salvare il risultato in un array NumPy specifico.
Inizializziamo un array di zeri per salvare l’output della precedente chiamata a argmax()
(con axis=1
):
out_arr = np.zeros((2,)) print(out_arr) # Output [0. 0.]
Ora, riproviamo l’esempio di argmax()
con axis=1
, impostando il parametro out
su out_arr
.
np.argmax(array_2,axis=1,out=out_arr)
L’interprete Python genera un TypeError
, perché out_arr
è stato inizializzato come array di float.
--------------------------------------------------------------------------- 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'
Quando si usa il parametro out
, è fondamentale che l’array di output abbia la forma e il tipo di dati corretti. Poiché gli indici degli array sono sempre interi, bisogna specificare dtype=int
quando si definisce l’array di output.
out_arr = np.zeros((2,),dtype=int) print(out_arr) # Output [0 0]
Ora possiamo chiamare argmax()
con entrambi i parametri axis
e out
, e tutto funzionerà correttamente:
np.argmax(array_2,axis=1,out=out_arr)
L’output della funzione argmax()
si trova ora nell’array out_arr
.
print(out_arr) # Output [2 0]
Conclusione
Spero che questa guida ti abbia aiutato a capire come utilizzare la funzione argmax()
di NumPy. Puoi sperimentare con gli esempi in un notebook Jupyter.
Rivediamo i punti principali:
- La funzione
argmax()
restituisce l’indice dell’elemento massimo di un array. Se il massimo appare più volte, restituisce l’indice della prima occorrenza. - In array multidimensionali, si può usare il parametro
axis
per ottenere l’indice del massimo lungo un asse specifico. In un array 2D,axis=0
indica le righe eaxis=1
le colonne. - Per salvare il risultato in un array specifico, si usa il parametro
out
. L’array deve avere forma e tipo di dati compatibili.
Se ti interessa approfondire, puoi consultare la nostra guida sui set in Python.