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