2011-05-08 20 views
14

Tengo un numpy.array de rango-1 del cual quiero hacer un diagrama de caja. Sin embargo, quiero excluir todos los valores iguales a cero en la matriz ... Actualmente, resolví esto haciendo un bucle en la matriz y copiando el valor a una nueva matriz si no es igual a cero. Sin embargo, como la matriz consta de 86 000 000 valores y tengo que hacer esto varias veces, esto requiere mucha paciencia.eliminando datos de un numpy.array

¿Hay alguna forma más inteligente de hacerlo?

Respuesta

11

este es un caso en el que desea utilizar matrices enmascarados, que mantiene la forma de la matriz y que es reconocido automáticamente por todas las funciones numpy y matplotlib.

X = np.random.randn(1e3, 5) 
X[np.abs(X)< .1]= 0 # some zeros 
X = np.ma.masked_equal(X,0) 
plt.boxplot(X) #masked values are not plotted 

#other functionalities of masked arrays 
X.compressed() # get normal array with masked values removed 
X.mask # get a boolean array of the mask 
X.mean() # it automatically discards masked values 
+0

enlace a la documentación: http://docs.scipy.org/doc/numpy/reference/routines.ma.html –

27

Para una matriz NumPy a, puede utilizar

a[a != 0] 

para extraer los valores no es igual a cero.

+0

Muchas gracias, esto funciona de hecho mucho (!) Más rápido. ¿Se puede hacer una acción similar en una matriz o matriz NumMpy de mayor rango? Porque aquí ocurre el problema de que las dimensiones ya no coincidirán correctamente ... –

+0

@rubae: si 'a' tiene una dimensión más alta, el resultado será una matriz aplanada (unidimensional). También sería posible eliminar columnas o filas que son todas cero. –

2

Me gustaría sugerirle que simplemente utilice NaN para casos como este, donde desea ignorar algunos valores, pero aún desea mantener el procedimiento estadístico lo más significativo posible. Así

In []: X= randn(1e3, 5) 
In []: X[abs(X)< .1]= NaN 
In []: isnan(X).sum(0) 
Out[: array([82, 84, 71, 81, 73]) 
In []: boxplot(X) 

enter image description here

+0

ah, el uso de NaN parece de hecho más apropiado aquí, gracias. Como tal, ya no necesito copiar mis datos a una nueva matriz con diferentes tamaños, pero puedo mantener la matriz original y, como tal, la ubicación en la matriz. Gracias ! –

+0

¿tal vez conoces una manera de repetir esto usando la lista de comprensión? es decir, estoy teniendo un diccionario 'a' donde' a [k] 'es una matriz NumPy, así que quería hacer' [a [k] [abs (a [k]) <. 1] = float ('NaN') para k en datos] 'pero esto parece fallar en el ciclo, mientras que solo ejecutar el comando en el bucle parece funcionar ... –

+0

@rubae: Creo que deberías hacer una pregunta por separado relacionada con este problema de comprensión de la lista. Desafortunadamente, ya no es tan fácil averiguar qué es lo que realmente estás buscando :(. Por lo que puedo adivinar, no te dejes engañar con la comprensión de la lista, quizás solo estés buscando algo simple como esto: 'para k en datos: a [k] [abs (a [k]) <.1] = NaN'? – eat

0

una simple línea de código se puede obtener una matriz que excluye todos los valores '0':

np.argwhere(*array*) 

ejemplo:

import numpy as np 
array = [0, 1, 0, 3, 4, 5, 0] 
array2 = np.argwhere(array) 
print array2 

[1, 3, 4, 5]