我正在尝试计算一个包含NaN的大型numpy数组的移动平均值。目前我正在使用:
import numpy as np
def moving_average(a,n=5):
ret = np.cumsum(a,dtype=float)
ret[n:] = ret[n:]-ret[:-n]
return ret[-1:]/n
当使用掩码数组进行计算时:
x = np.array([1.,3,np.nan,7,8,1,2,4,np.nan,np.nan,4,4,np.nan,1,3,6,3])
mx = np.ma.masked_array(x,np.isnan(x))
y = moving_average(mx).filled(np.nan)
print y
>>> array([3.8,3.8,3.6,nan,nan,nan,2,2.4,nan,nan,nan,2.8,2.6])
我想要的结果(如下)应该只在原始数组 x 中有 NaN 的位置上具有 NaN,并且平均值应该在分组中的非 NaN 元素数量上进行计算(我需要某种方法来更改函数中 n 的大小)。
y = array([4.75,4.75,nan,4.4,3.75,2.33,3.33,4,nan,nan,3,3.5,nan,3.25,4,4.5,3])
我可以遍历整个数组并逐个检查索引,但我使用的数组非常大,这将需要很长时间。是否有一种numpy式的方法来做到这一点?
[4.75,4.75,nan,4.4,3.75,2.33,3.33,4,nan,nan,3,3.5,nan,3.25]
是期望的输出吗?如果是,为什么第三个元素是NaN
? - Divakarnan
。 - krakenwagonnp.cumsum
方法的答案在我的实际数据中给出了最快的结果(我已更改采纳的答案)。所有的答案都给出了我想要的结果。 - krakenwagon