matplotlib hist而忽略特定的无数据值

Kur*_*ehr 6 python numpy matplotlib

我有一个2D numpy数组,1.0e6作为无数据值.我想生成数据的直方图,虽然我已经成功,但这不是最好的方法.

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)
Run Code Online (Sandbox Code Playgroud)

似乎应该有一个干净的(和更快的一个衬垫为此).在那儿?

Bru*_*uno 9

您可以使用布尔数组来选择所需的索引:

selected_values = (e_data > (no_data + eps)) & (e_data < (no_data - eps))
pyplot.hist(e_data[selected_values])
Run Code Online (Sandbox Code Playgroud)

(e_data > (no_data + eps))将创建一个np.bool具有相同形状的数组,当且仅当该索引处的值大于时,才e_data设置为True给定索引(no_data + eps).&是满足这两个条件的元素运算符.

或者,如果no_data只是一个约定,我会将这些值设置为numpy.nan,然后使用e_data[numpy.isfinite(e_data)].