矢量化滑动/滚动 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)
我正在处理的数组 x
和 n
是 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:]
我目前使用此代码进行移动 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)
我正在处理的数组 x
和 n
是 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:]