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

2024-05-23 17:36:09 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: 数据returnifvaluedefnpvariablesnan
2条回答

这应该管用。您可以在一行中完成这一切—为了清楚起见,我只创建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

您可以用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)

相关问题 更多 >