2016-06-10 50 views
5

Dire che ho una matrice numpy che ha qualche float ('nan'), non voglio imputare quei dati ora e voglio prima normalizzarli e mantenere i dati NaN nello spazio originale, c'è un modo in cui io può farlo?Come ignorare il punto dati NaN nell'array numpy e generare i dati normalizzati in Python?

Precedentemente, ho utilizzato la funzione normalize in sklearn.Preprocessing, ma questa funzione non può assumere alcun array contenuto NaN come input.

+0

La tua domanda non è chiara. Vuoi normalizzare un array con NaNs in esso e ignorare i NaN? – Chiel

+0

Voglio ignorare il NaNs – xxx222

risposta

9

È possibile mascherare la matrice utilizzando la funzione numpy.ma.array e successivamente applicare qualsiasi numpy operazione:

import numpy as np 

a = np.random.rand(10)   # Generate random data. 
a = np.where(a > 0.8, np.nan, a) # Set all data larger than 0.8 to NaN 

a = np.ma.array(a, mask=np.isnan(a)) # Use a mask to mark the NaNs 

a_norm = a/np.sum(a) # The sum function ignores the masked values. 
a_norm2 = a/np.std(a) # The std function ignores the masked values. 

È comunque possibile accedere ai dati grezzi:

print a.data 
+0

Grande, e quindi come posso recuperare i valori NaN? – xxx222

+0

Cosa intendi con recupero? – Chiel

+0

Voglio ripristinare quei valori NaN nell'array. – xxx222

1

È possibile utilizzare numpy.nansum per calcolare la norma ignora nan:

In [54]: x 
Out[54]: array([ 1., 2., nan, 3.]) 

Ecco la norma con nan ignorato:

In [55]: np.sqrt(np.nansum(np.square(x))) 
Out[55]: 3.7416573867739413 

y è la matrice normalizzata:

In [56]: y = x/np.sqrt(np.nansum(np.square(x))) 

In [57]: y 
Out[57]: array([ 0.26726124, 0.53452248,   nan, 0.80178373]) 

In [58]: np.linalg.norm(y[~np.isnan(y)]) 
Out[58]: 1.0