
In questo articolo viene rimosso come rimuovere elementi, righe e colonne che soddisfano la condizione dalla matrice NumPy ndarray.
- Estrarre gli elementi che soddisfano le condizioni
- Estrarre righe e colonne che soddisfano le condizioni
- Tutti gli elementi soddisfano la condizione:
numpy.all()
- Almeno un elemento soddisfa la condizione:
numpy.any()
- Tutti gli elementi soddisfano la condizione:
- Elimina elementi, righe e colonne che soddisfano le condizioni
- Usa ~ (NON)
- Usa numpy.delete() e numpy.where()
- Condizioni multiple
Vedere l’articolo seguente per un esempio quando ndarray contiene valori mancanti NaN.
Se si desidera sostituire o contare un elemento che soddisfa le condizioni, vedere il seguente articolo.
Se vuoi estrarre elementi che soddisfano la condizione, puoi usare ndarray[espressione condizionale].
Anche se il ndarray originale è un array multidimensionale, viene restituito un array unidimensionale appiattito.
import numpy as np
a = np.arange(12).reshape((3, 4))
print(a)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
print(a < 5)
# [[ True True True True]
# [ True False False False]
# [False False False False]]
print(a[a < 5])
# [0 1 2 3 4]
print(a < 10)
# [[ True True True True]
# [ True True True True]
# [ True True False False]]
print(a[a < 10])
# [0 1 2 3 4 5 6 7 8 9]
Viene restituito un nuovo ndarray e il ndarray rimane originale invariato. Lo stesso vale per i seguenti esempi.
b = a[a < 10]
print(b)
# [0 1 2 3 4 5 6 7 8 9]
print(a)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
È possibile calcolare la somma, la media, il valore massimo, il valore minimo, la deviazione standard, ecc. degli elementi che soddisfano la condizione.
print(a[a < 5].sum())
# 10
print(a[a < 5].mean())
# 2.0
print(a[a < 5].max())
# 4
print(a[a < 10].min())
# 0
print(a[a < 10].std())
# 2.8722813232690143
Estrarre righe e colonne che soddisfano le condizioni
Nell’esempio di estrazione di elementi, viene restituito un array unidimensionale, ma se utilizza np.all() e np.any(), puoi estrarre righe e colonne mantenendo la dimensione ndarray originale.
Tutti gli elementi soddisfano la condizione:numpy.all()
np.() è una funzione che finisce tutto contrario quando tutti gli elementi di ndarray passati al primo parametro sono True e richiede False in caso.
Se si specifica l’asse del parametro, riporta True se tutti gli elementi sono True per ciascun asse. Nel caso di una matrice bidimensionale, il risultato è per le colonne quando asse=0 e per le righe quando asse=1.
print(a < 5)
# [[ True True True True]
# [ True False False False]
# [False False False False]]
print(np.all(a < 5))
# False
print(np.all(a < 5, axis=0))
# [False False False False]
print(np.all(a < 5, axis=1))
# [ True False False]
print(a < 10)
# [[ True True True True]
# [ True True True True]
# [ True True False False]]
print(np.all(a < 10, axis=0))
# [ True True False False]
print(np.all(a < 10, axis=1))
# [ True True False]
Righe e colonne vengono estratte assegnando risultato a [righe, :] o [:, colonne]. Per [righe, :], il finale , : può essere omesso.
print(a[:, np.all(a < 10, axis=0)])
# [[0 1]
# [4 5]
# [8 9]]
print(a[np.all(a < 10, axis=1), :])
# [[0 1 2 3]
# [4 5 6 7]]
print(a[np.all(a < 10, axis=1)])
# [[0 1 2 3]
# [4 5 6 7]]
Se la condizione non è soddisfatta, viene restituito un ndarray vuoto.
print(a[:, np.all(a < 5, axis=0)])
# []
Anche se viene es solo una riga o una colonna, il numero di dimensioni non cambia.
print(a[np.all(a < 5, axis=1)])
# [[0 1 2 3]]
print(a[np.all(a < 5, axis=1)].ndim)
# 2
print(a[np.all(a < 5, axis=1)].shape)
# (1, 4)
Almeno un elemento soddisfa la condizione:numpy.any()
np.any() è una funzione che produce True quando ndarray passato al primo parametro contiene almeno un elemento True, altrimenti richiede False.
Se si specifica il parametro asse, riporta True se almeno un elemento è True per ciascun asse. Nel caso di una matrice bidimensionale, il risultato è per le colonne quando asse=0 e per le righe quando asse=1.
print(a < 5)
# [[ True True True True]
# [ True False False False]
# [False False False False]]
print(np.any(a < 5))
# True
print(np.any(a < 5, axis=0))
# [ True True True True]
print(np.any(a < 5, axis=1))
# [ True True False]
Puoi estrarre righe e colonne che soddisfano le condizioni allo stesso modo di np.all().
print(a[:, np.any(a < 5, axis=0)])
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
print(a[np.any(a < 5, axis=1)])
# [[0 1 2 3]
# [4 5 6 7]]
Elimina elementi, righe e colonne che soddisfano le condizioni
Se desideri eliminare elementi, righe o colonne invece di estrarli a seconda delle condizioni, sono disponibili i due metodi seguenti.
Usa ~ (NON)
Se aggiungi l’operatore di negazione ~ a una condizione, vengono estratti gli elementi, le righe e le colonne che non soddisfano la condizione. Ciò equivale all’eliminazione di elementi, righe o colonne che soddisfano la condizione.
print(a[~(a < 5)])
# [ 5 6 7 8 9 10 11]
print(a[:, np.all(a < 10, axis=0)])
# [[0 1]
# [4 5]
# [8 9]]
print(a[:, ~np.all(a < 10, axis=0)])
# [[ 2 3]
# [ 6 7]
# [10 11]]
print(a[np.any(a < 5, axis=1)])
# [[0 1 2 3]
# [4 5 6 7]]
print(a[~np.any(a < 5, axis=1)])
# [[ 8 9 10 11]]
Usa numpy.delete() e numpy.where()
Righe e colonne possono anche essere eliminate utilizzando np.delete() e np.where().
In np.delete(), imposta il target ndarray, l’indice da eliminare e l’asse target.
Nel caso di una matrice bidimensionale, le righe vengono eliminate se asse=0 e le colonne se asse=1.
print(a)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
print(np.delete(a, [0, 2], axis=0))
# [[4 5 6 7]]
print(np.delete(a, [0, 2], axis=1))
# [[ 1 3]
# [ 5 7]
# [ 9 11]]
Vedere anche il seguente articolo per np.delete().
np.where() restituisce l’indice dell’elemento che soddisfa la condizione.
Nel caso di un array multidimensionale, viene restituita una tupla di un elenco di indici (numero di riga, numero di colonna) che soddisfano la condizione per ciascuna dimensione (riga, colonna).
print(a < 2)
# [[ True True False False]
# [False False False False]
# [False False False False]]
print(np.where(a < 2))
# (array([0, 0]), array([0, 1]))
print(np.where(a < 2)[0])
# [0 0]
print(np.where(a < 2)[1])
# [0 1]
Vedere anche il seguente articolo per np.where().
Combinando queste due funzioni, è possibile eliminare le righe e le colonne che soddisfano la condizione.
print(np.delete(a, np.where(a < 2)[0], axis=0))
# [[ 4 5 6 7]
# [ 8 9 10 11]]
print(np.delete(a, np.where(a < 2)[1], axis=1))
# [[ 2 3]
# [ 6 7]
# [10 11]]
print(a == 6)
# [[False False False False]
# [False False True False]
# [False False False False]]
print(np.where(a == 6))
# (array([1]), array([2]))
print(np.delete(a, np.where(a == 6)))
# [ 0 3 4 5 6 7 8 9 10 11]
print(np.delete(a, np.where(a == 6)[0], axis=0))
# [[ 0 1 2 3]
# [ 8 9 10 11]]
print(np.delete(a, np.where(a == 6)[1], axis=1))
# [[ 0 1 3]
# [ 4 5 7]
# [ 8 9 11]]
Come nell’esempio precedente, le righe e le colonne che hanno almeno un elemento che soddisfa la condizione vengono eliminate. Questo è lo stesso che usare np.any().
Condizioni multiple
Se si desidera combinare più condizioni, racchiudere ciascuna espressione condizionale con () e utilizzare & o |.
print(a[(a < 10) & (a % 2 == 1)])
# [1 3 5 7 9]
print(a[np.any((a == 2) | (a == 10), axis=1)])
# [[ 0 1 2 3]
# [ 8 9 10 11]]
print(a[:, ~np.any((a == 2) | (a == 10), axis=0)])
# [[ 0 1 3]
# [ 4 5 7]
# [ 8 9 11]]