2011-11-07 4 views
5

Ho un array numpy 2D con 1,0e6 come valore senza dati. Mi piacerebbe generare un istogramma dei dati e mentre ci sono riuscito, questo non può essere il modo migliore per farlo.hist matplotlib ignorando un particolare valore senza dati

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) 

sembra che ci dovrebbe essere un pulito (e uno di linea molto più veloce per questo). È lì?

risposta

9

È possibile utilizzare una matrice booleana per selezionare gli indici richiesti:

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

(e_data > (no_data + eps)) creerà un array di np.bool con la stessa forma e_data, impostare True in un dato indice se e solo se il valore a quell'indice è maggiore di (no_data + eps). & corrisponde all'elemento e all'operatore per soddisfare entrambe le condizioni.

In alternativa, se no_data è solo una convenzione, impostarei questi valori su numpy.nan e utilizzare e_data[numpy.isfinite(e_data)].

Problemi correlati