了解NumPy的卷积


71

在计算简单的移动平均线时,numpy.convolve似乎可以完成任务。

问题:使用时如何进行计算np.convolve(values, weights, 'valid')

当文档提到时convolution product is only given for points where the signals overlap completely,这两个信号指的是什么?

如果有任何解释可以包括示例和说明,它将非常有用。

window = 10
weights = np.repeat(1.0, window)/window
smas = np.convolve(values, weights, 'valid')

NumPy手册中的numpy.convolve和底部的参考资料很好地解释了卷积和此特定实现。
rickhg12hs

Answers:


159

卷积是主要用于信号处理的数学运算符。Numpy只是使用此信号处理术语来定义它,因此引用了“信号”。numpy中的数组是一个信号。将两个信号的卷积定义为第一信号的积分,将其反转,在第二个信号上扫过(“卷积到”上)并在重叠矢量的每个位置乘以(与标量积)。通常将第一个信号称为内核,尤其是当它是图像处理或神经网络中的2-D矩阵,并且反转成为2-D镜像时(不转置)。使用Wikipedia上的动画可以更清楚地理解它。

卷积根据上下文具有多种定义。有些在重叠开始时开始卷积,而另一些在重叠只是部分时开始卷积。如果是numpy的“有效”模式,则将重叠指定为始终完整。之所以称为“有效”,是因为结果中给出的每个值都无需数据外推即可完成。

例如,如果数组X的长度为2,数组Y的长度为4,则在“有效”模式下X到Y的卷积将得到长度为3的数组。

第一步,针对X = [4 3]Y = [1 1 5 5]

[3 4]                   (X is reversed from [4 3] to [3 4], see note)
[1 1 5 5]
= 3 * 1 + 4 * 1 = 7

注意:如果没有反转X,则该运算将称为互相关而不是卷积。

第二步:

  [3 4]
[1 1 5 5]
= 3 * 1 + 4 * 5 = 23

第三步:

    [3 4]
[1 1 5 5]
= 3 * 5 + 4 * 5 = 35

模式“有效”的卷积结果将是[7 23 35]。

如果将重叠指定为一个数据点(例如在“ full”模式下的情况),则结果将为您提供长度为5的数组。第一步是:

[3 4]
  [1 1 5 5]
= 3 * undefined (extrapolated as 0) + 4 * 1 = 4

等等。存在更多的外推模式。


8
只是为了澄清一下:在解释的卷积中,向量[2 3]被镜像为[3 2]。这是对的。如果未镜像向量,则该操作将称为互相关。这是由于卷积的数学定义。
Soravux13年

相同的卷积模式呢?
拉蒙·马丁内斯

3
@RamonMartinez numpy文档中描述了此模式。基本上,它将按此处“完全”模式的说明执行,但是结果将被截断(相等地在左侧和右侧),使其长度与最长的输入相同。
Soravux

3
不确定为什么尚未被接受为正确答案。
bombayquant

5
该示例是[4,3]作为的第一个参数np.convolve()而不是 [3,4]。根据数学定义,卷积会反转第一个参数。
Soravux

0

还值得注意的是,内核是相对于数组的中心元素获取内核的“中心”。换句话说,对于索引从0开始的数组(如python中),该函数 B = np.convolve (A, K)将计算

B [k] = \ sum_i A [i] K [k-i + m]

在哪里m = (len(K) - 1)//2 (整数除法)。这是一个整数,len(K)即使是偶数也是如此。

名义上,总和是i从-∞到∞的所有值,其中A超出范围的值假定为零。内核的值也是如此。对于np.convolution2D,您必须选择使用模式,边界和填充值选项来指定如何A处理超出范围的值。

因此,例如,您对于np.convolve(A, K)if K = np.array([1, 2, 3])K = np.array([1, 2, 3, 0, 0])

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.