¿Cómo elimino los valores NaN de una matriz NumPy?
[1, 2, NaN, 4, NaN, 8] ⟶ [1, 2, 4, 8]
dax feliz
¿Cómo elimino los valores NaN de una matriz NumPy?
[1, 2, NaN, 4, NaN, 8] ⟶ [1, 2, 4, 8]
jmetz
Para eliminar valores NaN de una matriz NumPy x
:
x = x[~numpy.isnan(x)]
La función interna numpy.isnan
devuelve una matriz booleana/lógica que tiene el valor True
en todas partes que x
no es un número. Como queremos lo contrario, usamos el operador lógico-no ~
para obtener una matriz con True
está en todas partes que x
es un número válido
Por último, usamos esta matriz lógica para indexar en la matriz original x
para recuperar solo los valores que no son NaN.
O x = x[numpy.isfinite(x)]
– perezoso1
23 de julio de 2012 a las 22:29
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
19 de noviembre de 2013 a las 19:02
Para las personas que buscan resolver esto con un ndarray y mantener las dimensiones, use entumecido donde: np.where(np.isfinite(x), x, 0)
– Cerebro de Boltzmann
7 de septiembre de 2017 a las 2:51
TypeError: solo las matrices escalares enteras se pueden convertir en un índice escalar
– remolque
30 de junio de 2018 a las 14:29
@towry: esto está sucediendo debido a su entrada, x
no es una matriz numpy. Si desea utilizar la indexación lógica, debe ser una matriz, por ejemplo x = np.array(x)
– jmetz
2 de julio de 2018 a las 11:32
filter(lambda v: v==v, x)
funciona tanto para listas como para matrices numpy desde v!=v solo para NaN
Un truco, pero especialmente útil en el caso de que esté filtrando nans de una matriz de objetos con tipos mixtos, como cadenas y nans.
–Austin Richardson
29 de junio de 2015 a las 14:15
Esto puede parecer inteligente, pero si oscurece la lógica y, en teoría, otros objetos (como las clases personalizadas) también pueden tener esta propiedad.
– Chris_Rands
31 de julio de 2018 a las 15:02
También es útil porque solo necesita x
especificarse una vez en lugar de soluciones del tipo x[~numpy.isnan(x)]
. Esto es conveniente cuando x
está definido por una expresión larga y no desea saturar el código creando una variable temporal para almacenar el resultado de esta expresión larga.
– Christian O´Reilly
15 de junio de 2020 a las 1:09
Puede ser lento en comparación con x[~numpy.isnan(x)]
– mmm
21 de agosto de 2020 a las 21:23
Del mismo modo, como una lista de comprensión, por ejemplo [v for v in var if v == v]
–Darren Weber
18 de mayo a las 17:15
Prueba esto:
import math
print [value for value in x if not math.isnan(value)]
Para más información, sigue leyendo Lista de comprensiones.
Si está usando numpy, tanto mi respuesta como la de @ lazy1 son casi un orden de magnitud más rápidas que la comprensión de la lista: la solución de lazy1 es un poco más rápida (aunque técnicamente tampoco devolverá ningún valor infinito).
– jmetz
24 de julio de 2012 a las 13:54
No olvides los paréntesis 🙂 print ([value for value in x if not math.isnan(value)])
– hiperactivos
22 de noviembre de 2017 a las 16:09
Si está usando numpy como la respuesta principal, puede usar esta respuesta de comprensión de lista con el np
paquete: Entonces devuelve su lista sin los nans: [value for value in x if not np.isnan(value)]
– yeliabsalohcin
23 de noviembre de 2018 a las 14:09
Para mí, la respuesta de @jmetz no funcionó, sin embargo, usar pandas isnull() sí lo hizo.
x = x[~pd.isnull(x)]
La respuesta de @ jmetz es probablemente la que la mayoría de la gente necesita; sin embargo, produce una matriz unidimensional, por ejemplo, haciéndola inutilizable para eliminar filas o columnas enteras en matrices.
Para hacerlo, se debe reducir la matriz lógica a una dimensión y luego indexar la matriz de destino. Por ejemplo, lo siguiente eliminará filas que tengan al menos un valor NaN:
x = x[~numpy.isnan(x).any(axis=1)]
Ver más detalle aquí.
Shashank Srivastava
Como lo muestran 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.isna(x)] or x[~pandas.isnull(x)]
MelissaOu
Haciendo lo anterior:
x = x[~numpy.isnan(x)]
o
x = x[numpy.logical_not(numpy.isnan(x))]
Descubrí que restablecer la misma variable (x) no eliminó los valores reales de nan y tuve que usar una variable diferente. Establecerlo en una variable diferente eliminó los nans. p.ej
y = x[~numpy.isnan(x)]
Esto es extraño; de acuerdo a los documentosla indexación de matriz booleana (que es esto), está bajo indexación avanzada que aparentemente “siempre devuelve una copia de los datos”, por lo que debe sobrescribir x
con el nuevo valor (es decir, sin los NaNs…). ¿Puede proporcionar más información sobre por qué podría estar sucediendo esto?
– jmetz
24 de marzo de 2017 a las 10:35