在 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 但代码稍长)的类似方法是 。
我知道有各种优化的现成函数可用于执行 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 但代码稍长)的类似方法是