2011-11-07 24 views
5

Tôi có một mảng numpy 2D với 1.0e6 là giá trị không có dữ liệu. Tôi muốn tạo một biểu đồ dữ liệu và trong khi tôi đã thành công thì đây không phải là cách tốt nhất để làm điều đó.lịch sử matplotlib trong khi bỏ qua một giá trị dữ liệu không có giá trị cụ thể

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) 

Dường như phải có một lớp lót sạch (và nhanh hơn nhiều cho điều này). Lanhung?

Trả lời

9

Bạn có thể sử dụng một mảng boolean để chọn các chỉ số cần thiết:

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

(e_data > (no_data + eps)) sẽ tạo ra một mảng của np.bool với hình dạng giống như e_data, thiết lập để True tại một chỉ số nhất định khi và chỉ khi giá trị tại chỉ mục đó lớn hơn (no_data + eps). & là toán tử yếu tố để đáp ứng cả hai điều kiện.

Hoặc, nếu no_data chỉ là một quy ước, tôi sẽ đặt các giá trị đó thành numpy.nan thay thế và sử dụng e_data[numpy.isfinite(e_data)].

Các vấn đề liên quan