gpt4 book ai didi

python - 使用步幅填充 numpy 滚动窗口操作

转载 作者:太空宇宙 更新时间:2023-11-04 02:37:48 24 4
gpt4 key购买 nike

我有一个函数 f,我想在滑动窗口中高效地计算它。

def efficient_f(x):
# do stuff
wSize=50
return another_f(rolling_window_using_strides(x, wSize), -1)

我在 SO 上看到使用 strides 来做到这一点特别有效:从 numpy.lib.stride_tricks 导入 as_strided

def rolling_window_using_strides(a, window):
shape = a.shape[:-1] + (a.shape[-1] - window + 1, window)
strides = a.strides + (a.strides[-1],)
print np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides).shape
return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)

然后我尝试在 df 上应用它:

df=pd.DataFrame(data=np.random.rand(180000,1),columns=['foo'])
df['bar']=df[['foo']].apply(efficient_f,raw=True)
# note the double [[, otherwise pd.Series.apply
# (not accepting raw, and axis kwargs) will be called instead of pd.DataFrame.

它工作得非常好,而且确实带来了显着的性能提升。但是,我仍然收到以下错误:

ValueError: Shape of passed values is (1, 179951), indices imply (1, 180000).

这是因为我使用的是 wSize=50,这产生了

rolling_window_using_strides(df['foo'].values,50).shape
(1L, 179951L, 50L)

有没有办法通过在边界处填充 zero/np.nan 来得到

(1L, 180000, 50L)

因此与原始向量大小相同

最佳答案

这是用 np.lib.stride_tricks.as_strided 解决它的一种方法-

def strided_axis0(a, fillval, L): # a is 1D array
a_ext = np.concatenate(( np.full(L-1,fillval) ,a))
n = a_ext.strides[0]
strided = np.lib.stride_tricks.as_strided
return strided(a_ext, shape=(a.shape[0],L), strides=(n,n))

sample 运行-

In [95]: np.random.seed(0)

In [96]: a = np.random.rand(8,1)

In [97]: a
Out[97]:
array([[ 0.55],
[ 0.72],
[ 0.6 ],
[ 0.54],
[ 0.42],
[ 0.65],
[ 0.44],
[ 0.89]])

In [98]: strided_axis0(a[:,0], fillval=np.nan, L=3)
Out[98]:
array([[ nan, nan, 0.55],
[ nan, 0.55, 0.72],
[ 0.55, 0.72, 0.6 ],
[ 0.72, 0.6 , 0.54],
[ 0.6 , 0.54, 0.42],
[ 0.54, 0.42, 0.65],
[ 0.42, 0.65, 0.44],
[ 0.65, 0.44, 0.89]])

关于python - 使用步幅填充 numpy 滚动窗口操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47417420/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com