2010-08-31 7 views
12

En Numpy 1.4.1, ¿cuál es la forma más simple o más eficiente de calcular el histograma de una matriz enmascarada? numpy.histogram y pyplot.hist ¡cuenten los elementos enmascarados, por defecto!Cómo crear el histograma de una matriz con valores enmascarados, en Numpy?

La única solución simple que se me ocurre en este momento implica la creación de una nueva matriz con el valor no enmascarada:

histogram(m_arr[~m_arr.mask]) 

Esto no es muy eficiente, sin embargo, ya que esto innecesariamente crea una nueva matriz. ¡Estaría feliz de leer sobre mejores ideas!

+1

Por lo que vale, esto probablemente se consideraría un error en 'numpy.histogram'. Probablemente deberías presentar un informe de error y mencionarlo en la lista de correo. Se soluciona fácilmente al reemplazar 'asarray' con' asanyarray' en las fuentes 'numpy.histogram'. –

+0

Joe, es posible que desee enviar su comentario como respuesta: bien podría marcarlo como la respuesta aceptada, si los desarrolladores de Numpy lo confirman. – EOL

+2

Envié una pregunta rápida a la lista. http://mail.scipy.org/pipermail/numpy-discussion/2010-September/052575.html Veremos si la gente lo considera un error o no. Sin embargo, parece contra intuitivo para mí al menos. –

Respuesta

13

(Restauración de esto como por discusión anterior ...)

No estoy seguro de si o no los desarrolladores numpy considerarían esto como un error o comportamiento esperado. I asked on the mailing list, así que supongo que veremos lo que dicen.

De cualquier manera, es una solución fácil. Parchear numpy/lib/function_base.py para usar numpy.asanyarray en lugar de numpy.asarray en las entradas de la función le permitirá usar correctamente matrices enmascaradas (o cualquier otra subclase de un ndarray) sin crear una copia.

Editar: Parece que es el comportamiento esperado. As discussed here:

Si desea ignorar los datos enmascarados que es sólo en la llamada función adicional

histograma (m_arr.compressed())

No creo que el hecho de que esto hace un copia adicional será relevante, porque supongo que la matriz completa enmascarada que se maneja dentro del histograma será mucho más cara.

Usando asanyarray también permitiría matrices en otros subtipos y que no, puede ser tratada correctamente por los cálculos histograma.

Para cualquier otra cosa aparte de dejar caer observaciones enmascarados, sería necesario averiguar cuál es la definición de matriz enmascarada de un histograma es, como Bruce señaló.

+0

Gracias. Uno de los argumentos en contra del manejo de matrices enmascaradas en histogramas es que si los histogramas manejaban valores enmascarados, uno tendría que decidir cómo deberían tratarse los datos enmascarados con una matriz enmascarada de pesos. No creo que haya ninguna mejor solución para este problema: parece que las características de 'histogram()' no se mezclan muy bien con las matrices de pesaje y entrada enmascarada. – EOL

7

Probar hist(m_arr.compressed()).

+1

Esta es una mejor idea que mi 'm_arr [~ m_arr.mask]'. Sin embargo, no resuelve el problema de que una nueva matriz se corrige innecesariamente. – EOL

+0

PD: "corregido" -> "creado" – EOL

2

Esta es una cuestión muy viejo, pero estos días sólo tiene que utilizar:

numpy.histogram(m_arr, bins=.., range=.., density=False, weights=m_arr_mask)

Dónde m_arr_mask es una matriz con la misma forma que m_arr, que consta de 0 valores para elementos de m_arr a ser excluido del histograma y 1 valores para los elementos que deben ser incluidos.

+0

¿Qué tan bien funciona eso para NaNs? –

+0

Además, esto no funcionará si intentas pasar una cadena para 'contenedores'. Gran respuesta aparte de eso. –

Cuestiones relacionadas