¿Cómo elimino los valores NaN de una matriz NumPy?

4 minutos de lectura

avatar de usuario
dax feliz

¿Cómo elimino los valores NaN de una matriz NumPy?

[1, 2, NaN, 4, NaN, 8]   ⟶   [1, 2, 4, 8]

avatar de usuario
jmetz

Para eliminar valores NaN de una matriz NumPy x:

x = x[~numpy.isnan(x)]
Explicación

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 Trueestá en todas partes que x es un número válido

Por último, usamos esta matriz lógica para indexar en la matriz original xpara 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) == Falsepor 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í.

avatar de usuario
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)]

avatar de usuario
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

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad