
Con numpy.where, puoi sostituire o manipolare elementi dell’array NumPy ndarray che soddisfano le condizioni.
In questo articolo vengono descritti i seguenti contenuti.
- Panoramica di np.dove()
- np.where() con più condizioni
- Sostituisci gli elementi che soddisfano la condizione
- Manipolare gli elementi che soddisfano la condizione
- Ottieni gli indicatori degli elementi che soddisfano la condizione
Se desideri estrarre o eliminare elementi, righe e colonne che soddisfano le condizioni, consulta il seguente articolo.
Panoramica di np.dove()
numpy.where(condizione[, x, y])
Restituisce elementi, da xo giorno y, a seconda della condizione.
Se viene specificata solo la condizione, arriva condition.nonzero().
numpy.where — Manuale di NumPy v1.14
np.where() è una funzione che provoca ndarray che è x se la condizione è vera ey se è falsa. x, ye condition devono essere trasmessi con la stessa forma.
Se x ey vengono omessi, viene restituito index. I dettagli sono descritti più avanti.
import numpy as np
a = np.arange(9).reshape((3, 3))
print(a)
# [[0 1 2]
# [3 4 5]
# [6 7 8]]
print(np.where(a < 4, -1, 100))
# [[ -1 -1 -1]
# [ -1 100 100]
# [100 100 100]]
Puoi ottenere il booleano ndarray da un’espressione condizionale che includa ndarray senza usare np.where().
print(a < 4)
# [[ True True True]
# [ True False False]
# [False False False]]
np.where() con più condizioni
Puoi applicare più condizioni con np.where() racchiudendo ogni espressione condizionale tra () e usando & o |.
print(np.where((a > 2) & (a < 6), -1, 100))
# [[100 100 100]
# [ -1 -1 -1]
# [100 100 100]]
print(np.where((a > 2) & (a < 6) | (a == 7), -1, 100))
# [[100 100 100]
# [ -1 -1 -1]
# [100 -1 100]]
Vedere il seguente articolo per sapere perché è necessario utilizzare &, | invece di e, oe perché sono necessarie le parentesi.
Anche nel caso di condizioni multiple, non è necessario utilizzare np.where() per ottenere il booleano ndarray.
print((a > 2) & (a < 6))
# [[False False False]
# [ True True True]
# [False False False]]
print((a > 2) & (a < 6) | (a == 7))
# [[False False False]
# [ True True True]
# [False True False]]
Sostituisci gli elementi che soddisfano la condizione
È anche possibile sostituire elementi con un determinato valore solo quando la condizione è soddisfatta o non soddisfatta.
Se si passa il ndarray originale a xey, il valore originale viene utilizzato così com’è.
print(np.where(a < 4, -1, a))
# [[-1 -1 -1]
# [-1 4 5]
# [ 6 7 8]]
print(np.where(a < 4, a, 100))
# [[ 0 1 2]
# [ 3 100 100]
# [100 100 100]]
Nota che np.where() aggiunge un nuovo ndarray e il ndarray originale è invariato.
a_org = np.arange(9).reshape((3, 3))
print(a_org)
# [[0 1 2]
# [3 4 5]
# [6 7 8]]
a_new = np.where(a_org < 4, -1, a_org)
print(a_new)
# [[-1 -1 -1]
# [-1 4 5]
# [ 6 7 8]]
print(a_org)
# [[0 1 2]
# [3 4 5]
# [6 7 8]]
Se vuoi aggiornare lo stesso ndarray originale, puoi scrivere:
a_org[a_org < 4] = -1
print(a_org)
# [[-1 -1 -1]
# [-1 4 5]
# [ 6 7 8]]
Manipolare gli elementi che soddisfano la condizione
Invece del ndarray originale, puoi anche specificare espressioni per xe y.
print(np.where(a < 4, a * 10, a))
# [[ 0 10 20]
# [30 4 5]
# [ 6 7 8]]
Ottieni gli indicatori degli elementi che soddisfano la condizione
Se xey vengono omessi, vengono restituiti gli indici degli elementi che soddisfano la condizione.
Viene restituita una tupla di una matrice di indici (numero di riga, numero di colonna) che soddisfano la condizione per ciascuna dimensione (riga, colonna).
print(np.where(a < 4))
# (array([0, 0, 0, 1]), array([0, 1, 2, 0]))
print(type(np.where(a < 4)))
# <class 'tuple'>
In questo caso, significa che gli elementi in [0, 0], [0, 1], [0, 2] e [1, 0] soddisfano la condizione.
È anche possibile ottenere un elenco di ciascuna coordinata utilizzando list(), zip() e * come segue:
print(list(zip(*np.where(a < 4))))
# [(0, 0), (0, 1), (0, 2), (1, 0)]
Lo stesso vale per gli array multidimensionali di tre o più dimensioni.
a_3d = np.arange(24).reshape(2, 3, 4)
print(a_3d)
# [[[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
#
# [[12 13 14 15]
# [16 17 18 19]
# [20 21 22 23]]]
print(np.where(a_3d < 5))
# (array([0, 0, 0, 0, 0]), array([0, 0, 0, 0, 1]), array([0, 1, 2, 3, 0]))
print(list(zip(*np.where(a_3d < 5))))
# [(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 0, 3), (0, 1, 0)]
Lo stesso vale per gli array unidimensionali. Nota che usando list(), zip() e *, ogni elemento nell’elenco risultante è una tupla con un elemento.
a_1d = np.arange(6)
print(a_1d)
# [0 1 2 3 4 5]
print(np.where(a_1d < 3))
# (array([0, 1, 2]),)
print(list(zip(*np.where(a_1d < 3))))
# [(0,), (1,), (2,)]
Se sai che è unidimensionale, puoi usare il primo elemento del risultato di np.where() così com’è. In questo caso, sarà un ndarray con un intero int come elemento, non una tupla con un elemento. Se vuoi desiderare in una lista, usa tolist().
print(np.where(a_1d < 3)[0])
# [0 1 2]
print(np.where(a_1d < 3)[0].tolist())
# [0, 1, 2]
È possibile ottenere il numero di dimensioni con l’attributo ndim.
