在 NumPy 中向量化 2D 卷积

Vectorizing 2D Convolutions in NumPy

我知道有各种优化的现成函数可用于执行 2D 卷积,但只是为了理解,我正在尝试实现我自己的 2D 卷积函数。

以下是我目前所做的:

    convoluted = []
    # TODO: Vectorize
    for i in range(0, M - m + 1):
        for j in range(0, N - n + 1):
            submatrix = x[i:i+m, j:j+n]
            convoluted.append(np.sum([submatrix*kernel]))
    convoluted = np.array(convoluted).reshape(M - m + 1, N - n + 1)

注意x是输入图像数组,(M, N)是输入图像的形状,(m, n)是使用的核的形状

2 个显式 for 循环 相当 慢。
有什么办法可以将其矢量化吗?感谢任何帮助
(我知道可以使用 python 列表理解,至少对于内循环,但我正在寻找一种更快的方法,如果有的话)

我想你正在寻找这个:

from skimage.util.shape import view_as_windows
sub_matrices = view_as_windows(x, (m,n), 1)
convoluted = np.einsum('ij,klij->kl',kernel,sub_matrices)

第一行从原始数组创建 windows 的内核大小。第二行是简单的乘法和加法(类似于 for 循环中的行,更优雅地删除它的循环)。这和您的代码的输出应该是相同的。如果您设置为不使用其中任何一个,请告诉我们您编辑 post.

的限制

另一种不使用 skimage 包(仅使用 numpy 但代码稍长)的类似方法是