使用 numpy 滞后向量乘法的有效方法

Efficient way to lag vector multiplication using numpy

我正在尝试优化一种算法,该算法涉及多个向量乘法,其中一个向量保持不变,而另一个向量不断移动,直到完成所有计算。

例如,如果静态向量是

a = [3 2 0]

移动矢量为

b = [2 5 6 3 8 4]

我愿意return

[[6 10 0], [15 12 0], [18 6 0], [9 16 0]] ([[2], [5], [6]] * [[3], [2], [0]] = [[6], [10], [0]] and [[5], [6], [3]] * [[3], [2], [0]] = [[15], [12], [0]], etc.). Is there an efficient way to do this calculation in python/numpy? Or will I just have to loop over slices of <b>b</b> and multiply each by <b>a</b>?

我考虑过将 a 放入类似对角线的矩阵中:

[[3 2 0 0 0 0],

 [0 3 2 0 0 0],

 [0 0 3 2 0 0],

 [0 0 0 3 2 0]]

并将其乘以对角化的 b,例如:

[[2 0 0 0 0 0],

 [0 5 0 0 0 0],

 [0 0 6 0 0 0],

 [0 0 0 3 0 0],

 [0 0 0 0 8 0],

 [0 0 0 0 0 4]]

获得:

[[6 10 0  0  0  0],

 [0 15 12 0  0  0],

 [0 0  18 6  0  0],

 [0 0  0  9  16 0]] 

但这似乎有点过分并且 space 密集。

希望我的问题有道理。感谢您的帮助!

我们可以利用 np.lib.stride_tricks.as_strided based scikit-image's view_as_windows to get sliding windows. 。因此,对于那些 strided-view,假设数组作为输入,它将是 -

In [7]: from skimage.util.shape import view_as_windows

In [8]: view_as_windows(b,len(a))*a
Out[8]: 
array([[ 6, 10,  0],
       [15, 12,  0],
       [18,  6,  0],
       [ 9, 16,  0]])