繁体   English   中英

在 NumPy 中矢量化 2D 卷积

[英]Vectorizing 2D Convolutions in NumPy

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

以下是我目前所做的:

    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)是使用的kernel的形状。

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)

第一行从原始数组创建 kernel 大小的 windows。 第二行是简单的乘法和加法(类似于 for 循环中的行,为它删除循环更优雅)。 这个的output和你的代码应该是一样的。 如果您设置为不使用其中任何一个,请告诉我们您编辑帖子的限制。

另一种不使用 skimage package 的类似方法(仅使用 numpy 但代码稍长)在这里

我以 Ehsan 的答案为基础,以获得仅使用 Numpy 的最短答案:

windows = np.lib.stride_tricks.sliding_window_view(img, kernel.shape)
convolved_img = np.einsum('ij,klij->kl',kernel,windows)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM