In Python, possiamo utilizzare la funzione numpy.where() per selezionare elementi da un array numpy, in base a una condizione.
Non solo, ma possiamo anche eseguire delle operazioni su quegli elementi se la condizione è soddisfatta.
Guardiamo come possiamo utilizzare questa funzione, utilizzando alcuni esempi illustrativi!
Sintassi di Python numpy.where()
Questa funzione accetta un array simile a numpy (es. un array NumPy di interi/booleani).
Restituisce un nuovo array numpy, dopo il filtraggio in base a una condizione, che è un array simile a numpy di valori booleani.
Per esempio, condizione
può assumere il valore di array([[True, True, True]]
), che è un array booleano simile a numpy. (Per impostazione predefinita, NumPy supporta solo valori numerici, ma possiamo anche convertirli in bool
)
Ad esempio, se condizione
è array([[True, True, False]])
, e il nostro array è a = ndarray([[1, 2, 3]])
, applicando una condizione all’array (a[:, condizione]
), otterremo l’array ndarray([[1 2]])
.
Output
NOTA: La stessa condizione può essere rappresentata anche come a <= 2. Questo è il formato consigliato per l’array di condizioni, poiché è molto noioso scriverlo come un array booleano
Ma cosa succede se vogliamo mantenere la dimensione del risultato e non perdere elementi dal nostro array originale? Possiamo usare numpy.where() per questo.
Abbiamo altri due parametri x
e y
. Cosa sono?
Fondamentalmente, questo significa che se condizione
è vera per qualche elemento nel nostro array, il nuovo array sceglierà elementi da x
.
Altrimenti, se è falsa, verranno presi elementi da y
.
Con questo, il nostro array di output finale sarà un array con elementi da x
ovunque condizione = True
, e elementi da y
ogni volta che condizione = False
.
Nota che anche se x
e y
sono opzionali, se specifici x
, DEVI specificare anche y
. Questo perché, in questo caso, la forma dell’array di output deve essere la stessa dell’array di input.
NOTA: La stessa logica si applica sia per gli array monodimensionali che multidimensionali. In entrambi i casi, filtriamo in base alla condizione. Ricorda anche che le forme di x
, y
e condizione
vengono trasmesse insieme.
Ora, vediamo alcuni esempi per capire correttamente questa funzione.
Utilizzando numpy.where() in Python
Supponiamo di voler prendere solo gli elementi positivi da un array numpy e impostare tutti gli elementi negativi a 0, scriviamo il codice utilizzando numpy.where()
.
1. Sostituire gli elementi con numpy.where()
Useremo qui un array casuale bidimensionale e otterremo solo gli elementi positivi.
Output Possibile
Come puoi vedere, sono stati conservati solo gli elementi positivi!
2. Utilizzo di numpy.where() con solo una condizione
Potrebbe esserci un po’ di confusione riguardo al codice sopra, poiché alcuni di voi potrebbero pensare che il modo più intuitivo sarebbe semplicemente scrivere la condizione in questo modo:
Se ora provate a eseguire il codice sopra, con questa modifica, otterrete un output simile a questo:
Se osservate attentamente, b
è ora una tupla di array numpy. E ogni array è la posizione di un elemento positivo. Cosa significa questo?
Ogni volta che forniamo solo una condizione, questa funzione è in realtà equivalente a np.asarray.nonzero()
.
Nel nostro esempio, np.asarray(a > 0)
restituirà un array simile a booleano dopo aver applicato la condizione, e np.nonzero(arr_like)
restituirà gli indici degli elementi diversi da zero di arr_like
. (Fare riferimento a questo link)
Quindi, ora esamineremo un esempio più semplice, che ci mostra quanto siamo flessibili con numpy!
Output
Qui, la condizione è a < 5
, che sarà l’array simile a numpy [True True True True True False False False False False]
, x
è l’array a, e y
è l’array a * 10. Quindi, scegliamo da a solo se a < 5, e da a * 10, se a > 5.
Quindi, questo trasforma tutti gli elementi >= 5, moltiplicandoli per 10. Questo è ciò che otteniamo effettivamente!
Trasmissione con numpy.where()
Se forniamo tutti gli array condizione
, x
e y
, numpy li trasmetterà insieme.
Output
Di nuovo, qui l’output è selezionato in base alla condizione, quindi tutti gli elementi, ma qui, b
viene trasmesso alla forma di a
. (Una delle sue dimensioni ha solo un elemento, quindi non ci saranno errori durante la trasmissione)
Quindi, b
diventerà ora [[0 1 2 3] [0 1 2 3] [0 1 2 3]]
, e ora possiamo selezionare elementi anche da questo array trasmesso.
Quindi la forma dell’output è la stessa della forma di a
.
Conclusione
In questo articolo abbiamo appreso come utilizzare la funzione numpy.where() di Python per selezionare array in base a un’altra array di condizioni.
Riferimenti
- Documentazione di SciPy sulla funzione numpy.where() di Python
Source:
https://www.digitalocean.com/community/tutorials/python-numpy-where