Come utilizzare il metodo numpy.where() di Python

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

import numpy as np

a = np.arange(10)
print(a[a <= 2]) # Catturerà solo elementi <= 2 e ignorerà gli altri

Output

array([0 1 2])

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.

numpy.where(condition [, x, y])

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.

import numpy as np

# Inizializzazione casuale di un array bidimensionale
a = np.random.randn(2, 3)
print(a)

# b sarà tutti gli elementi di a quando la condizione è vera (ovvero solo gli elementi positivi)
# Altrimenti, impostalo a 0
b = np.where(a > 0, a, 0)

print(b)

Output Possibile

[[-1.06455975  0.94589166 -1.94987123]
 [-1.72083344 -0.69813711  1.05448464]]
[[0.         0.94589166 0.        ]
 [0.         0.         1.05448464]]

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:

import random
import numpy as np

a = np.random.randn(2, 3)
b = np.where(a > 0)
print(b)

Se ora provate a eseguire il codice sopra, con questa modifica, otterrete un output simile a questo:

(array([0, 1]), array([2, 1]))

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!

import numpy as np

a = np.arange(10)

b = np.where(a < 5, a, a * 10)

print(a)
print(b)

Output

[0 1 2 3 4 5 6 7 8 9]
[ 0  1  2  3  4 50 60 70 80 90]

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.

import numpy as np

a = np.arange(12).reshape(3, 4)

b = np.arange(4).reshape(1, 4)

print(a)
print(b)

# Trasmissioni (a < 5, a e b * 10)
# di forma (3, 4), (3, 4) e (1, 4)
c = np.where(a < 5, a, b * 10)

print(c)

Output

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
[[0 1 2 3]]
[[ 0  1  2  3]
 [ 4 10 20 30]
 [ 0 10 20 30]]

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


Source:
https://www.digitalocean.com/community/tutorials/python-numpy-where