2011-11-07 16 views
5

我有一個2D numpy數組1.0e6作爲無數據值。我想生成一個數據的直方圖,雖然我已經成功,但這不是實現這一目標的最佳方式。matplotlib hist而忽略一個特定的無數據值

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) 

似乎應該有一個乾淨的(和更快的一個班輪爲此)。在那兒?

回答

9

可以使用布爾陣列選擇需要的指數:一個給定的索引處

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

(e_data > (no_data + eps))將創建的np.bool陣列具有相同的形狀e_data,設置爲True當且僅當該值該指數大於(no_data + eps)&是元素明智的運營商滿足這兩個條件。

或者,如果no_data只是一個慣例,我會將這些值設置爲numpy.nan而不是e_data[numpy.isfinite(e_data)]