Cómo eliminar todas las filas en un numpy.ndarray que contienen valores no numéricos

95

Básicamente, estoy haciendo un análisis de datos. Leí en un conjunto de datos como numpy.ndarray y faltan algunos de los valores (ya sea por no estar allí, por estar NaNo por ser una cadena escrita " NA").

Quiero limpiar todas las filas que contengan una entrada como esta. ¿Cómo hago eso con un ndarray numpy?

cebra
fuente

Respuestas:

164
>>> a = np.array([[1,2,3], [4,5,np.nan], [7,8,9]])
array([[  1.,   2.,   3.],
       [  4.,   5.,  nan],
       [  7.,   8.,   9.]])

>>> a[~np.isnan(a).any(axis=1)]
array([[ 1.,  2.,  3.],
       [ 7.,  8.,  9.]])

y reasignar esto a a.

Explicación: np.isnan(a)devuelve una matriz similar con Truewhere NaN, en Falseotro lugar. .any(axis=1)reduce una m*nmatriz a nuna oroperación lógica en todas las filas, ~invierte True/Falsey a[ ]elige solo las filas de la matriz original, que tienen Trueentre paréntesis.

eumiro
fuente
11
np.isfinitetambién es útil en este caso, así como cuando desea deshacerse de ±Infvalores. No requiere ~, ya que devuelve verdadero solo para reales finitos.
naught101
7
@ naught101 También debes cambiar anya all. Dado que desea seleccionar filas donde "todos son finitos", en lugar de seleccionar filas donde "ninguno es nan".
AnnanFay