获取数据集中的值的均值,同时忽略两个值

时间:2017-08-05 20:07:39

标签: python numpy mean

我有一个数据集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的价值吗?

2 个答案:

答案 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)
  • 如果不允许修改输入数组,请创建一个临时屏蔽数组(选项3)

答案 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