2012-07-23 7 views
98

Quiero averiguar cómo eliminar los valores nan de mi matriz. Se parece a esto:Eliminar valores nan de una matriz

x = [1400, 1500, 1600, nan, nan, nan ,1700] #Not in this exact configuration 

Soy relativamente nuevo en python, así que sigo aprendiendo. ¿Algun consejo?

Respuesta

178

Si está utilizando numpy para sus matrices, también se puede utilizar

x = x[numpy.logical_not(numpy.isnan(x))] 

De manera equivalente

x = x[~numpy.isnan(x)] 

[Gracias a chbrown para la taquigrafía añadido]

Explicación

La función interna, numpy.isnan devuelve una matriz booleana/lógica que tiene el valor True donde x no es un número. Como queremos lo contrario, utilizamos el operador lógico-no, ~ para obtener una matriz con True s en todas partes que xes un número válido.

Por último, utilizamos esta matriz lógica para indexar en la matriz original x, para recuperar solo los valores que no son de NaN.

+17

O 'x = x [numpy.isfinite (x)]' – lazy1

+11

O 'x = x [~ numpy.isnan (x)] ', que es equivalente a la respuesta original de mutzmatron, pero más corta. En caso de que quiera mantener sus infinitos, sepa que 'numpy.isfinite (numpy.inf) == False', por supuesto, pero' ~ numpy.isnan (numpy.inf) == True'. – chbrown

+0

@ dax-felizv Estoy de acuerdo con @chbrown, NaN e Infinite no son lo mismo en 'numpy'. @chbrown - gracias por señalar la abreviatura de 'logical_not', aunque ten en cuenta que es considerablemente más lento - http://stackoverflow.com/questions/15998188/how-can-i-obtain-the-element-wise-logical- serie no-de-un-pandas, http://stackoverflow.com/questions/13600988/python-tilde-unary-operator-as-negation-numpy-bool-array – jmetz

32

Prueba esto:

import math 
print [value for value in x if not math.isnan(value)] 

Para más información, lea el List Comprehensions.

+1

Si está utilizando numpy tanto mi respuesta y que por @ lazy1 son casi un orden de magnitud más rápido que la lista de comprensión - La solución de lazy1 es ligeramente más rápido (aunque técnicamente tampoco devolverá ningún valor de infinito). – jmetz

+0

No olvide los corchetes :) 'print ([valor para el valor en x si no math.isnan (value)])' – hypers

24
filter(lambda v: v==v, x) 

obras para las listas y la variedad numpy desde v = v sólo para NaN

+2

Un truco pero especialmente útil en el caso en que está filtrando nans de una matriz de objetos con tipos mixtos, como strings y nans. –

+0

Solución muy limpia. – Moondra

3

de hacer lo anterior:

x = x[~numpy.isnan(x)] 

o

x = x[numpy.logical_not(numpy.isnan(x))] 

me encontré con que el restablecimiento a la misma variable (x) no eliminó los valores nan reales y tuvo que usar una variable diferente. Al establecerlo en una variable diferente se eliminó el nans. p.

y = x[~numpy.isnan(x)] 
+0

Esto es extraño; de acuerdo con [los documentos] (https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#advanced-indexing), la indexación de matriz booleana (que es), está bajo ** indexación avanzada * * que aparentemente "siempre devuelve una copia de los datos", por lo que debe sobreescribir 'x' con el nuevo valor (es decir, sin los NaNs ...). ¿Puede proporcionar más información sobre por qué esto podría estar pasando? – jmetz

4

Para mí la respuesta por @jmetz no funcionó, sin embargo con isnull pandas() lo hizo.

x = x[~pd.isnull(x)] 
1

Como se muestra por otros

x[~numpy.isnan(x)] 

obras. Pero arrojará un error si el numpy dtype no es un tipo de datos nativo, por ejemplo, si es un objeto. En ese caso, puedes usar pandas.

x[~pandas.isnan(x)] 
0

Si está utilizando numpy

# first get the indices where the values are finite 
ii = np.isfinite(x) 

# second get the values 
x = x[ii] 
Cuestiones relacionadas