使用 NaN 计算 numpy 数组中的移动平均值

kra*_*gon 5 python numpy masked-array

我正在尝试计算包含 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
Run Code Online (Sandbox Code Playgroud)

使用掩码数组进行计算时:

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])
Run Code Online (Sandbox Code Playgroud)

我正在寻找的结果(如下)理想情况下应该只在原始数组 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])
Run Code Online (Sandbox Code Playgroud)

我可以遍历整个数组并按索引检查索引,但我使用的数组非常大,这需要很长时间。有没有一种 numpythonic 的方法来做到这一点?

jer*_*rry 1

在您仍然可以使用 cumsum 来实现此目的之前,我将添加到很好的答案:

import numpy as np

def moving_average(a, n=5):
    ret = np.cumsum(a.filled(0))
    ret[n:] = ret[n:] - ret[:-n]
    counts = np.cumsum(~a.mask)
    counts[n:] = counts[n:] - counts[:-n]
    ret[~a.mask] /= counts[~a.mask]
    ret[a.mask] = np.nan

    return ret

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)
Run Code Online (Sandbox Code Playgroud)