gpt4 book ai didi

python - 滑动窗口操作的 Numpy 向量化

转载 作者:太空狗 更新时间:2023-10-30 02:09:04 25 4
gpt4 key购买 nike

我有以下 numpy 数组:

arr_1 = [[1,2],[3,4],[5,6]]   # 3 X 2 
arr_2 = [[0.5,0.6],[0.7,0.8],[0.9,1.0],[1.1,1.2],[1.3,1.4]] # 5 X 2

arr_1 显然是一个 3 X 2 数组,而 arr_2 是一个 5 X 2 数组。

现在没有循环,我想按元素乘以 arr_1 和 arr_2,以便我将滑动窗口技术(窗口大小 3)应用于 arr_2。

Example:

Multiplication 1: np.multiply(arr_1,arr_2[:3,:])

Multiplication 2: np.multiply(arr_1,arr_2[1:4,:])

Multiplication 3: np.multiply(arr_1,arr_2[2:5,:])

我想以某种矩阵乘法形式执行此操作,以使其比我当前的解决方案更快:

for i in (2):
np.multiply(arr_1,arr_2[i:i+3,:])

因此,如果 arr_2 中的行数很大(数量级为数万),则此解决方案的扩展性并不是很好。

如有任何帮助,我们将不胜感激。

最佳答案

我们可以使用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

关于python - 滑动窗口操作的 Numpy 向量化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39232790/

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