首先,这是scipy.nanmean()
这样我们就知道我们正在比较什么:
def nanmean(x, axis=0):
x, axis = _chk_asarray(x,axis)
x = x.copy()
Norig = x.shape[axis]
factor = 1.0-np.sum(np.isnan(x),axis)*1.0/Norig
x[np.isnan(x)] = 0
return np.mean(x,axis)/factor
从数学上讲,这两种方法是等效的。从数字上看,它们是不同的。
您的方法涉及单个除法,并且碰巧:
- 分子(
1. + 2. + 4. + 5.
) 可以精确地表示为float
; and
- 分母 (
4.
) 是 2 的幂。
这意味着除法的结果是准确的,3.
.
stats.nanmean()
涉及首先计算平均值[1., 2., 0., 4., 5.]
,然后调整它以考虑NaNs
。碰巧的是,这意味着 (2.4
) 不能精确地表示为float
,所以从这一点来看计算是不精确的。
我没有考虑太多,但也许可以构建一个角色互换的例子,并且stats.nanmean()
会比其他方法给出更准确的结果。
让我惊讶的是stats.nanmean()
不只是简单地做类似的事情:
In [6]: np.mean(np.ma.MaskedArray(a, np.isnan(a)))
Out[6]: 3.0
在我看来,这似乎是比目前所做的更好的方法。