了解NumPy的Convolve

时间:2013-11-17 21:53:16

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

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

2 个答案:

答案 0 :(得分:100)

卷积是一种主要用于信号处理的数学运算符。 Numpy只是使用这种信号处理命名法来定义它,因此"信号"引用。 numpy中的数组是一个信号。两个信号的卷积被定义为第一个信号的积分,反转,扫过("卷积到")第二个信号,并在每个信号上相乘(用标量积)重叠矢量的位置。第一个信号通常称为内核,特别是当它是image processing或神经网络中的二维矩阵时,反转变为{{3 (不转置)。使用mirroring in 2-D可以更清楚地理解它。

根据具体情况,卷积有多种定义。一些在重叠开始时开始卷积,而另一些在重叠仅部分时开始。在numpy"有效"模式,指定重叠始终完成。它被称为"有效"因为结果中给出的每个值都没有数据外推。

例如,如果你的数组X的长度为2,而你的数组Y的长度为4,则将X卷积到Y中,并且#34;有效" mode会给你一个长度为3的数组。

第一步,对于X = [4 3]和Y = [1 1 5 5]:

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

第二步:

  [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

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

答案 1 :(得分: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)的不同答案, K = np.array([1, 2, 3])K = np.array([1, 2, 3, 0, 0])