2015-01-26 11 views
5

Sto semplicemente cercando di utilizzare una matrice mascherata per filtrare alcune voci nan.Maschera Python Numpy NaN non funzionante

import numpy as np 
# x = [nan, -0.35, nan] 
x = np.ma.masked_equal(x, np.nan) 
print x 

Emette il seguente:

masked_array(data = [  nan -0.33557216   nan], 
     mask = False, 
    fill_value = nan) 

Calling np.isnan() sul x restituisce il corretto allineamento booleano, ma la maschera semplicemente non sembra funzionare. Perché la mia maschera non funzionerebbe come previsto?

+2

probabilmente si dovrebbe usare [ 'np.ma. masked_invalid() '] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.ma .masked_invalid.html # numpy.ma.masked_invalid). –

+0

che funziona, grazie. se pubblichi una risposta posso chiudere questa domanda – chris

risposta

7

È possibile utilizzare np.ma.masked_invalid:

import numpy as np 

x = [np.nan, 3.14, np.nan] 
mx = np.ma.masked_invalid(x) 

print(repr(mx)) 
# masked_array(data = [-- 3.14 --], 
#    mask = [ True False True], 
#  fill_value = 1e+20) 

In alternativa, utilizzare np.isnan(x) come parametro mask=-np.ma.masked_array:

print(repr(np.ma.masked_array(x, np.isnan(x)))) 
# masked_array(data = [-- 3.14 --], 
#    mask = [ True False True], 
#  fill_value = 1e+20) 

Perché non funziona il vostro approccio originale? Perché, piuttosto controintuitivamente, NaN non è uguale a NaN!

print(np.nan == np.nan) 
# False 

Questo è in realtà part of the IEEE-754 definition of NaN

1

Ecco un'altra alternativa senza l'utilizzo di maschera:

import numpy as np 
#x = [nan, -0.35, nan] 
xmask=x[np.logical_not(np.isnan(x))] 
print(xmask) 

Risultato:

array([-0.35])

Problemi correlati