2011-11-07 14 views
5

Mam tablicę 2D numpy z wartością 1.0e6 jako wartością bez danych. Chciałbym wygenerować histogram danych i chociaż mi się to udało, nie może to być najlepszy sposób na zrobienie tego.matplotlib hist ignorując konkretną wartość braku danych

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) 

Wygląda na to, że powinna istnieć czysta (i znacznie szybsza jedna wkładka do tego). Jest tu?

Odpowiedz

9

Można użyć logiczną tablicę, aby wybrać żądane indeksach:

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

(e_data > (no_data + eps)) stworzy tablicę np.bool z takim samym kształcie jak e_data, zestaw do True w danym indeksie wtedy i tylko wtedy, gdy wartość przy tym indeksie jest większy niż (no_data + eps). & jest operatorem elementarnym i, aby spełnić oba warunki.

Alternatywnie, jeśli no_data jest tylko konwencją, ustawiłbym te wartości na numpy.nan zamiast tego i użyłbym e_data[numpy.isfinite(e_data)].

Powiązane problemy