【问题标题】:Understanding NumPy's Convolve了解 NumPy 的卷积
【发布时间】:2013-11-30 22:43:09
【问题描述】:

在计算简单的移动平均线时,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')

【问题讨论】:

标签: python python-2.7 numpy convolution moving-average


【解决方案1】:

卷积是主要用于信号处理的数学运算符。 Numpy 只是使用这个信号处理命名法来定义它,因此是“信号”引用。 numpy 中的数组是一个信号。两个信号的卷积定义为第一个信号的积分,反转,扫描(“卷积”)第二个信号并在重叠向量的每个位置相乘(与标量积)。第一个信号通常称为内核,尤其是当它是image processing 或神经网络中的二维矩阵时,反转 变成mirroring in 2-D(不是转置)。使用the animations on 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 未反转,则该操作将称为 cross-correlation 而不是卷积。

第二步:

  [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]。

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

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

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

【讨论】:

  • 只是为了澄清一下:向量 [2 3] 在解释的卷积中被镜像为 [3 2]。这是对的。如果向量没有被镜像,则该操作将被称为互相关。这是由于卷积的数学定义。
  • 卷积中的同一个模式呢?
  • @RamonMartinez 此模式在numpy documentation 中进行了描述。基本上,它将按照此处“完整”模式的说明执行,但结果将被截断(左右相等)以与最长输入的长度相同。
  • 不知道为什么这还没有被接受为正确答案。
  • 这个例子是[4,3]作为np.convolve()的第一个参数,not [3,4]。根据数学定义,卷积反转第一个参数。
【解决方案2】:

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

m = (len(K) - 1)//2(整数除法)。这是一个整数,当len(K) 是偶数时也是如此。

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

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

【讨论】: