这个问题已经问了很多次了,但是我还是不能得到我想要的。想象一下
data=np.random.rand(N,N) #shape N x N
kernel=np.random.rand(3,3) #shape M x M
我知道卷积通常意味着将核放在整个数据上,但在我的例子中,N
和M
的数量级为10000。因此,我希望得到数据中特定位置的卷积值,比如(10、37),而不需要在所有位置进行不必要的计算。因此输出将只是一个数字。主要目标是减少计算和内存开销。有没有内置函数可以在最小的调整下做到这一点?
1条答案
按热度按时间vlf7wbxs1#
实际上,对特定位置应用卷积与
data
中的子矩阵与 * flip * 核本身的(逐点)乘法的元素之和一致。这里是一个可重现的示例。代码
带输出
kernel
被here中所解释的卷积的定义翻转了,Warren Weckesser好心地指出了这一点。谢谢!关键是要理解你提供的索引,我假设它指的是
data
中子矩阵的左上角,但是当M
是奇数时,它也可以指中点。概念
N=7
和M=3
的另一个示例说明了这一思想,并在here中为内核提供了该示例当翻转时产生
编辑1:
请注意,本视频中的讲师并没有明确提到,在逐点乘法之前需要翻转内核,以遵守卷积的数学正确定义。
编辑2:
对于大的
M
和接近data
边界的目标索引,可能会抛出ValueError: operands could not be broadcast together with shapes ...
。为了防止这种情况,用零填充矩阵data
可以防止这种情况(尽管这会增加内存需求)。