python中窗口滑动讲解-python – 滑动窗口操作的Numpy Vectorization

我们可以使用

NumPy broadcasting以矢量化方式创建那些滑动窗口索引.然后,我们可以简单地将arr_2索引到那些用于创建3D数组并使用2D数组arr_1执行元素乘法的那些,这反过来将再次引入广播.

所以,我们会有一个像这样的矢量化实现 –

W = arr_1.shape[0] # Window size

idx = np.arange(arr_2.shape[0]-W+1)[:,None] + np.arange(W)

out = arr_1*arr_2[idx]

运行时测试并验证结果 –

In [143]: # Input arrays

...: arr_1 = np.random.rand(3,2)

...: arr_2 = np.random.rand(10000,2)

...:

...: def org_app(arr_1,arr_2):

...: W = arr_1.shape[0] # Window size

...: L = arr_2.shape[0]-W+1

...: out = np.empty((L,W,arr_1.shape[1]))

...: for i in range(L):

...: out[i] = np.multiply(arr_1,arr_2[i:i+W,:])

...: return out

...:

...: def vectorized_app(arr_1,arr_2):

...: W = arr_1.shape[0] # Window size

...: idx = np.arange(arr_2.shape[0]-W+1)[:,None] + np.arange(W)

...: return arr_1*arr_2[idx]

...:

In [144]: np.allclose(org_app(arr_1,arr_2),vectorized_app(arr_1,arr_2))

Out[144]: True

In [145]: %timeit org_app(arr_1,arr_2)

10 loops, best of 3: 47.3 ms per loop

In [146]: %timeit vectorized_app(arr_1,arr_2)

1000 loops, best of 3: 1.21 ms per loop

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值