了解NumPy的Convolve

Nyx*_*nyx 62 python numpy convolution moving-average python-2.7

在计算简单移动平均线时,numpy.convolve似乎可以完成这项工作.

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

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

如果任何解释可以包括示例和插图,那将非常有用.

window = 10
weights = np.repeat(1.0, window)/window
smas = np.convolve(values, weights, 'valid')
Run Code Online (Sandbox Code Playgroud)

Sor*_*vux 121

卷积是一种主要用于信号处理的数学运算符.Numpy只是使用这个信号处理命名法来定义它,因此"信号"引用.numpy中的数组是一个信号.两个信号的卷积被定义为第一信号的积分,被反转,扫过("卷入")第二信号并且在重叠矢量的每个位置处相乘(用标量积).第一个信号通常称为内核,特别是当它是图像处理或神经网络中的二维矩阵时,反转变为二维镜像(非转置).使用维基百科上的动画可以更清楚地理解它.

根据上下文,卷积有多个定义.一些在重叠开始时开始卷积,而另一些在重叠仅部分时开始.在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
Run Code Online (Sandbox Code Playgroud)

第二步:

  [3 4]
[1 1 5 5]
= 3 * 1 + 4 * 5 = 23
Run Code Online (Sandbox Code Playgroud)

第三步:

    [3 4]
[1 1 5 5]
= 3 * 5 + 4 * 5 = 35
Run Code Online (Sandbox Code Playgroud)

模式"有效"的卷积结果将是[7 23 35].

如果重叠被指定为一个单一数据点(如模式"full"中的情况),结果将给出一个长度为5的数组.第一步是:

[3 4]
  [1 1 5 5]
= 3 * undefined (extrapolated as 0) + 4 * 1 = 4
Run Code Online (Sandbox Code Playgroud)

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

  • 只是澄清一下:向量[2 3]在解释的卷积中被镜像为[3 2].这是对的.如果矢量未镜像,则该操作将被称为互相关.这是由于卷积的数学定义. (7认同)
  • 例子是`[4,3]`作为`np.convolve()`的第一个参数,*不是*`[3,4]`.通过数学定义,卷积反转第一个参数. (4认同)
  • 不知道为什么这还没有被接受为正确答案。 (3认同)
  • @RamonMartinez [numpy文档](http://docs.scipy.org/doc/numpy/reference/produced/numpy.convolve.html)中描述了此模式。基本上,它的性能与此处“完全”模式所说明的相同,但是结果将被截断(相等地在左侧和右侧),该长度与最长输入的长度相同。 (2认同)

小智 6

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

\n

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

\n

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

\n

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

\n

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

\n