1

当我在完全屏蔽的屏蔽数组中计算加权平均值时,我得到不同的结果weights=Noneor weights=1

import numpy.ma as ma
a = ma.arange(2.)
a[:] = ma.masked                             # fully masked
ma.average(a)                                # returns NaN, which is ok since all elements are masked
ma.average(a, weights=None,  returned=True)  # returns (NaN, 0.0), which is ok also
ma.average(a, weights=(1,1), returned=True)  # returns 'masked'

我希望最后两行产生相同的结果 - 即相同数量的输出和相同的值,但它们没有。最烦人的是,在最后一种情况下,尝试检索第二个输出参数时会发生错误。为什么我会得到这些结果?

4

1 回答 1

2

我同意这种行为很烦人,但这只是numpy.ma.average编码的方式。如果您查看它的源代码,您会看到在第 505 行附近,如果weights=None或如果它是其他东西,if 子句的执行方式会有所不同。

weights != None操作导致中间产品之一是掩码数组时。稍后在代码中(第 562 行),检查这些中间数组中的屏蔽数组,如果为真,则输出将始终被屏蔽。另一种情况何时weights == None导致 aNaN被抛出,所以这将是输出。

别担心,这种不一致似乎只在数组的所有元素都被屏蔽时才会发生。在现实世界的例子中,将权重设置为None或统一数组将给出相同的结果。

于 2012-12-11T09:58:59.397 回答