numpy
Filtraggio dei dati
Ricerca…
Filtraggio dei dati con un array booleano
Quando viene fornito un solo argomento alla funzione di numpy in where
restituisce gli indici dell'array di input (la condition
) che viene valutata come true (stesso comportamento di numpy.nonzero
). Questo può essere usato per estrarre gli indici di una matrice che soddisfano una determinata condizione.
import numpy as np
a = np.arange(20).reshape(2,10)
# a = array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
# [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]])
# Generate boolean array indicating which values in a are both greater than 7 and less than 13
condition = np.bitwise_and(a>7, a<13)
# condition = array([[False, False, False, False, False, False, False, False, True, True],
# [True, True, True, False, False, False, False, False, False, False]], dtype=bool)
# Get the indices of a where the condition is True
ind = np.where(condition)
# ind = (array([0, 0, 1, 1, 1]), array([8, 9, 0, 1, 2]))
keep = a[ind]
# keep = [ 8 9 10 11 12]
Se non si ha bisogno degli indici, questo può essere ottenuto in un solo passaggio usando extract
, dove si specifica la condition
come primo argomento, ma si fornisce array
di restituire i valori da dove la condizione è vera come secondo argomento.
# np.extract(condition, array)
keep = np.extract(condition, a)
# keep = [ 8 9 10 11 12]
Due ulteriori argomenti x
e y
possono essere forniti per where
, nel qual caso l'uscita conterrà i valori di x
in cui la condizione è True
ei valori di y
dove la condizione è False
.
# Set elements of a which are NOT greater than 7 and less than 13 to zero, np.where(condition, x, y)
a = np.where(condition, a, a*0)
print(a)
# Out: array([[ 0, 0, 0, 0, 0, 0, 0, 0, 8, 9],
# [10, 11, 12, 0, 0, 0, 0, 0, 0, 0]])
Indici filtranti diretti
Per casi semplici, puoi filtrare i dati direttamente.
a = np.random.normal(size=10)
print(a)
#[-1.19423121 1.10481873 0.26332982 -0.53300387 -0.04809928 1.77107775
# 1.16741359 0.17699948 -0.06342169 -1.74213078]
b = a[a>0]
print(b)
#[ 1.10481873 0.26332982 1.77107775 1.16741359 0.17699948]