HOWTO · NumPy
Come rimuovere i valori NaN da un array NumPy
Scopri come rimuovere i valori NaN da un array NumPy in Python
In questa pagina
Per rimuovere i valori NaN da un array NumPy, crea una maschera booleana che sia vera per i valori diversi da NaN, quindi usala per selezionare gli elementi. Con un array NumPy, la forma concisa è array[~np.isnan(array)].
Rimuovere i valori NaN con le funzioni logical_not() e isnan() di NumPy
np.isnan(array) restituisce un array booleano con True nelle posizioni in cui l’elemento è NaN. np.logical_not() inverte questi valori, così la maschera risultante è True per i numeri ordinari. L’indicizzazione booleana mantiene gli elementi corrispondenti nel loro ordine originale. L’operatore ~ è l’equivalente più breve per questo array booleano NumPy.
Questo esempio applica entrambe le forme e mostra anche cosa accade quando l’input contiene solo NaN oppure nessun NaN:
import numpy as np
values = np.array([1.0, np.nan, 3.0])
without_nan = values[np.logical_not(np.isnan(values))]
without_nan_short = values[~np.isnan(values)]
all_nan = np.array([np.nan, np.nan])
no_nan = np.array([1, 2, 3])
print(without_nan)
print(without_nan_short)
print(all_nan[~np.isnan(all_nan)])
print(no_nan[~np.isnan(no_nan)])
[1. 3.]
[1. 3.]
[]
[1 2 3]
Le due maschere producono gli stessi valori filtrati. Se l’input contiene solo NaN, il risultato è un array vuoto; se non contiene NaN, l’array rimane invariato. Consulta la documentazione ufficiale di np.logical_not() e quella di np.isnan().
Rimuovere i valori NaN con la funzione isfinite() di NumPy
np.isfinite(array) crea una maschera vera per i numeri finiti. Usarla per indicizzare rimuove i NaN, ma anche l’infinito positivo e quello negativo. Scegli questa funzione quando vuoi mantenere solo valori finiti; se vuoi rimuovere esclusivamente i NaN e conservare gli infiniti, usa la maschera invertita di np.isnan() descritta sopra. Per i dettagli sul comportamento con i tipi numerici, consulta la documentazione ufficiale di np.isfinite().
Rimuovere i valori NaN con math.isnan()
La funzione math.isnan() della libreria standard di Python controlla un singolo valore alla volta. Per usarla, importa prima il modulo con import math. Con un array numerico monodimensionale, una list comprehension può creare una maschera booleana: keep = [not math.isnan(value) for value in values], seguita da filtered = values[keep]. Questo approccio scorre ogni elemento dell’array in Python, mentre le funzioni NumPy operano sull’array. È pensato per un input monodimensionale: iterando su un array multidimensionale si ottengono sottoarray, non numeri singoli.
Rimuovere i valori NaN con pandas.isnull()
Se il tuo progetto usa già pandas, importalo con import pandas as pd; pd.isnull() individua i valori mancanti e può fornire la maschera invertita: filtered = values[~pd.isnull(values)]. È una funzione di pandas, non un metodo NumPy, e non richiede di installare pandas appositamente per questa operazione. Nei tipi di dati supportati, il rilevamento dei valori mancanti comprende anche gli altri indicatori di dato mancante di pandas. Consulta la documentazione di pandas su isnull().