我有一个数据集dod
,我想在dod
中取值的均值。在dod
中填充值,值为-9.99
,值为0
。我想在取平均值时忽略这些值。
到目前为止,我只能忽略填充值:
dod = f.variables['dod_modis_flg1'][i]
def nan_if(arr, value):
return np.where(arr == value, np.nan, arr)
mean = np.nanmean([nan_if(dod, -9.99)])
print(mean)
有人知道如何在忽略0
的同时忽略IDocHostUIHandler
的价值吗?
答案 0 :(得分:0)
您可以使用nan
替换不需要的值,但这会更改原始数组:
dod[~numpy.logical_or(numpy.isclose(dod, 0), numpy.isclose(dod, -9.99))] = numpy.nan
numpy.mean(dod)
需要分配三个额外的布尔数组来执行操作,但不会创建额外的浮点数组。
或者只选择您想要的值并取平均值:
tmp = dod[~numpy.logical_or(numpy.isclose(dod, 0), numpy.isclose(dod, -9.99))]
numpy.mean(tmp)
但是这将另外创建一个中间浮点数组
numpy.may_share_memory(tmp, dod) # False
第三个选项是创建一个掩盖的数组,如:
tmp2 = numpy.ma.masked_where(
numpy.logical_or(numpy.isclose(dod, 0), numpy.isclose(dod, -9.99)),
dod,
copy=False
)
numpy.mean(tmp2)
只创建额外的布尔数组但没有中间浮点数组:
numpy.may_share_memory(tmp2.data, dod) # True
答案 1 :(得分:0)
这应该有效。您可以在一行中完成所有操作 - 我只是为了清晰起见而创建了new_array
变量:
# get the dod array but without -9.99 or 0.
new_array = dod[~np.isin(dod, [-9.99, 0])]
np.nanmean(new_array)
注意:需要numpy> = 1.13