2011-11-07 7 views
5

Tengo una matriz numpy 2D con 1.0e6 como valor sin datos. Me gustaría generar un histograma de los datos y, aunque he tenido éxito, esta no puede ser la mejor manera de hacerlo.matplotlib hist sin tener en cuenta un valor de datos particular

from matplotlib import pyplot 
import sys 

eps = sys.float_info.epsilon 
no_data = 1.0e6 

e_data = elevation.reshape(elevation.size) 
e_data_clean = [ ] 

for i in xrange(len(e_data)): 
    val = e_data[i] 
    # floating point equality check for val aprox not equal no_data 
    if val > no_data + eps and val < no_data - eps: 
     e_data_clean.append(val) 

pyplot.hist(e_data_clean, bins=100) 

Parece que debe haber una limpia (y mucho más rápido un trazador de líneas para esto). ¿Esta ahí?

Respuesta

9

Se puede utilizar una matriz booleana para seleccionar los índices requeridos:

selected_values = (e_data > (no_data + eps)) & (e_data < (no_data - eps)) 
pyplot.hist(e_data[selected_values]) 

(e_data > (no_data + eps)) crearán una serie de np.bool con la misma forma que e_data, fijados a True a un índice determinado si y sólo si el valor en ese índice es mayor que (no_data + eps). & es el operador de elemento y para satisfacer ambas condiciones.

Alternativamente, si no_data es solo una convención, establecería esos valores en numpy.nan y usaría e_data[numpy.isfinite(e_data)].

Cuestiones relacionadas