矢量化滑动/滚动 numpy nanmean

Vectorized sliding / rolling numpy nanmean

我目前使用此代码进行移动 window 平均:

n=500

x_copy=np.hstack((np.full(n,np.nan),copy.deepcopy(x),np.full(n,np.nan)))

x_values=[]
for i in range(n,len(x)+n):
    x_values.append(np.nanmean(x[i-n:i+n+1]))

plt.plot(x_values)

我正在处理的数组 xn 是 window 长度的一半。但是,我需要快速执行此操作,因为我必须执行大约 4400*10 次此操作,数组的长度约为 60000 个元素。搜索了一段时间后,我发现 np.convolve 应该可以,所以我有这个代码:

plt.plot(np.convolve(x, np.ones(((2*n),))/(2*n), mode='valid'),zorder=2)

虽然这真的很快,但它并没有完全按照我的需要去做,因为它似乎在数组结束前停止了 500*2 个单位。作为参考,这里是他们两个图的图像:蓝色是我自己的代码,橙色是卷积。我想使用卷积来加速我的移动 window 平均,但我不知道如何。

Reference

将那些 NaNs 设置为 0s,然后在那些 masked 版本上使用 np.convolve -

# Window-size
W = 2*n+1

# Non-nans mask
m = ~np.isnan(x)

# "Masked" input array
x0 = np.where(m,x,0)

# Setup conv kernel and perform conv on x0 and mask m for the counts to divide
K = np.ones(W)
out = (np.convolve(x0,K)/np.convolve(m,K))[W-1:]