使用 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]])
我正在尝试优化一种算法,该算法涉及多个向量乘法,其中一个向量保持不变,而另一个向量不断移动,直到完成所有计算。
例如,如果静态向量是
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]])