2011-11-07 13 views
5

को अनदेखा करते समय मुझे 1.0e6 के साथ कोई डेटा मान के रूप में 2 डी numpy सरणी मिली है। मैं डेटा का हिस्टोग्राम उत्पन्न करना चाहता हूं और जब मैं सफल हुआ हूं तो यह करने का सबसे अच्छा तरीका नहीं हो सकता है।matplotlib हिस्ट एक विशेष डेटा डेटा

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))e_data रूप में एक ही आकार के साथ np.bool की एक सरणी पैदा करेगा, True करने के लिए सेट तभी मूल्य अगर उस सूचकांक में (no_data + eps) से अधिक है। & दोनों स्थितियों को संतुष्ट करने के लिए तत्व-वार और ऑपरेटर है।

वैकल्पिक रूप से, यदि no_data सिर्फ एक सम्मेलन है, तो मैं उन मानों को numpy.nan पर सेट कर दूंगा, और e_data[numpy.isfinite(e_data)] का उपयोग करूंगा।

संबंधित मुद्दे