Rimuovi i valori nan da un array NumPy

Vaibhav Vaibhav 30 gennaio 2023
  1. Rimuovi i valori nan utilizzando i metodi logical_not() e isnan() in NumPy
  2. Rimuovi i valori nan utilizzando il metodo isfinite() in NumPy
  3. Rimuovere i valori nan utilizzando il metodo math.isnan
  4. Rimuovere i valori nan utilizzando il metodo pandas.isnull
Rimuovi i valori nan da un array NumPy

Questo articolo discuterà alcune funzioni integrate di NumPy che puoi usare per eliminare i valori nan.

Rimuovi i valori nan utilizzando i metodi logical_not() e isnan() in NumPy

La funzione logical_not() è usata per applicare un NOT logico agli elementi di un array. La funzione isnan() è una funzione booleana che controlla se un elemento è nan oppure no.

Usando la funzione isnan(), possiamo creare un array booleano che ha False per tutti i valori non nan e True per tutti i valori nan. Successivamente, utilizzando la funzione logical_not(), possiamo convertire True in False e viceversa.

Infine, usando l’indicizzazione booleana, possiamo filtrare tutti i valori non nan dall’array NumPy originale. Tutti gli indici con True come valore verranno usati per filtrare l’array NumPy.

Per saperne di più su queste funzioni in modo approfondito, fare riferimento alla loro documentazione ufficiale e qui, rispettivamente.

Fare riferimento al seguente frammento di codice per la soluzione.

import numpy as np

myArray = np.array([1, 2, 3, np.nan, np.nan, 4, 5, 6, np.nan, 7, 8, 9, np.nan])
output1 = myArray[np.logical_not(np.isnan(myArray))]  # Line 1
output2 = myArray[~np.isnan(myArray)]  # Line 2
print(myArray)
print(output1)
print(output2)

Produzione:

[ 1.  2.  3. nan nan  4.  5.  6. nan  7.  8.  9. nan]
[1. 2. 3. 4. 5. 6. 7. 8. 9.]
[1. 2. 3. 4. 5. 6. 7. 8. 9.]

La Line 2 è una versione semplificata della Line 1.

Rimuovi i valori nan utilizzando il metodo isfinite() in NumPy

Come suggerisce il nome, la funzione isfinite() è una funzione booleana che controlla se un elemento è finito o meno. Può anche controllare valori finiti in un array e restituisce un array booleano per lo stesso. L’array booleano memorizzerà False per tutti i valori nan e True per tutti i valori finiti.

Useremo questa funzione per recuperare un array booleano per l’array di destinazione. Utilizzando l’indicizzazione booleana, filtreremo tutti i valori finiti. Anche in questo caso, come accennato in precedenza, gli indici con valori True verranno utilizzati per filtrare l’array.

Ecco il codice di esempio.

import numpy as np

myArray1 = np.array([1, 2, 3, np.nan, np.nan, 4, 5, 6, np.nan, 7, 8, 9, np.nan])
myArray2 = np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan])
myArray3 = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
output1 = myArray1[np.isfinite(myArray1)]
output2 = myArray2[np.isfinite(myArray2)]
output3 = myArray3[np.isfinite(myArray3)]
print(myArray1)
print(myArray2)
print(myArray3)
print(output1)
print(output2)
print(output3)

Produzione:

[ 1.  2.  3. nan nan  4.  5.  6. nan  7.  8.  9. nan]
[nan nan nan nan nan nan]
[ 1  2  3  4  5  6  7  8  9 10]
[1. 2. 3. 4. 5. 6. 7. 8. 9.]
[]
[ 1  2  3  4  5  6  7  8  9 10]

Per saperne di più su questa funzione, fare riferimento alla documentazione ufficiale

Rimuovere i valori nan utilizzando il metodo math.isnan

Oltre a queste due soluzioni NumPy, ci sono altri due modi per rimuovere i valori nan. Questi due modi implicano la funzione isnan() dalla libreria math e la funzione isnull dalla libreria pandas. Entrambe queste funzioni controllano se un elemento è nan o meno e restituiscono un risultato booleano.

Ecco la soluzione usando il metodo isnan().

import numpy as np
import math

myArray1 = np.array([1, 2, 3, np.nan, np.nan, 4, 5, 6, np.nan, 7, 8, 9, np.nan])
myArray2 = np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan])
myArray3 = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
booleanArray1 = [not math.isnan(number) for number in myArray1]
booleanArray2 = [not math.isnan(number) for number in myArray2]
booleanArray3 = [not math.isnan(number) for number in myArray3]
print(myArray1)
print(myArray2)
print(myArray3)
print(myArray1[booleanArray1])
print(myArray2[booleanArray2])
print(myArray3[booleanArray3])

Produzione:

[ 1.  2.  3. nan nan  4.  5.  6. nan  7.  8.  9. nan]
[nan nan nan nan nan nan]
[ 1  2  3  4  5  6  7  8  9 10]
[1. 2. 3. 4. 5. 6. 7. 8. 9.]
[]
[ 1  2  3  4  5  6  7  8  9 10]

Rimuovere i valori nan utilizzando il metodo pandas.isnull

Di seguito è la soluzione utilizzando il metodo isnull() da pandas.

import numpy as np
import pandas as pd

myArray1 = np.array([1, 2, 3, np.nan, np.nan, 4, 5, 6, np.nan, 7, 8, 9, np.nan])
myArray2 = np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan])
myArray3 = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
booleanArray1 = [not pd.isnull(number) for number in myArray1]
booleanArray2 = [not pd.isnull(number) for number in myArray2]
booleanArray3 = [not pd.isnull(number) for number in myArray3]
print(myArray1)
print(myArray2)
print(myArray3)
print(myArray1[booleanArray1])
print(myArray2[booleanArray2])
print(myArray3[booleanArray3])
print(myArray1[~pd.isnull(myArray1)])  # Line 1
print(myArray2[~pd.isnull(myArray2)])  # Line 2
print(myArray3[~pd.isnull(myArray3)])  # Line 3

Produzione:

[ 1.  2.  3. nan nan  4.  5.  6. nan  7.  8.  9. nan]
[nan nan nan nan nan nan]
[ 1  2  3  4  5  6  7  8  9 10]
[1. 2. 3. 4. 5. 6. 7. 8. 9.]
[]
[ 1  2  3  4  5  6  7  8  9 10]
[1. 2. 3. 4. 5. 6. 7. 8. 9.]
[]
[ 1  2  3  4  5  6  7  8  9 10]
Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.