numpy.convolve 和 Python 中的旧数字无法更改

Old numbers can't change in numpy.convolve and Python

我正在与 numpy.convolve 合作。老实说,我不确定我是否为我正在工作的项目使用了正确的模块。

我希望 numpy convolve(或者如果有任何其他我可以实现的模块)不改变以前的数字。我不想更改旧号码,我希望它们得到修复。因此,当我获得新数据时,唯一会受到影响的是新数据,而不是其他数据。

这里举个例子来说明:

import numpy 

N = 3
numbers = [11,-5,54,-100,1]
numbers_mean  = numpy.convolve(numbers, numpy.ones((N,))/N)[(N-1):]
print numbers_mean

输出:

[ 20.         -17.         -15.         -33.           0.33333333]

但是当我将最后一个数字从 1 改为 100 时,结果改变了所有 3 个数字。

N = 3
numbers = [11,-5,54,-100,100]
numbers_mean  = numpy.convolve(numbers, numpy.ones((N,))/N)[(N-1):]
print numbers_mean

输出:

[ 20.         -17.          18.           0.          33.33333333]

只是输出:

[ 20.         -17.         -15.         -33.           0.33333333]
[ 20.         -17.          18.           0.          33.33333333]

这就是我想看到的:

[ 20.         -17.         -15.         -33.           33.33333333<- this number only should change not the rest]

正如您所见,当数字从 1 变为 100 时,它改变了 -33。到 0。这不是我想要的我希望所有这些数字都是固定的并且 none 更改唯一应该能够更改的数字是最新的数字。在这种情况下 33.333333 来自 0.3333

有什么模块或方法可以在 Python 中实现吗?

我不是 numpy 专家,所以我会向您推荐一个 Python 解决方案:

In [342]: fixed = np.convolve([11,-5,54,-100,1], np.ones((N,))/N)[(N-1):-1]

In [343]: fixed
Out[343]: array([ 20., -17., -15., -33.])

In [344]: np.append(fixed, np.convolve([11,-5,54,-100,100], np.ones((N,))/N)[-1])
Out[344]: array([ 20.        , -17.        , -15.        , -33.        ,  33.33333333])

您想计算​​ 3 个邻域均值。所以你有一个 mask=[1./3,1./3,1./3],大小是 N

看看一个更简单的例子会发生什么,numbers = [0,1,2,3,4],它的大小是 M>=N :

In [1]: numpy.convolve(numbers,mask)
Out[1]: 
array([ 0.        ,  0.33333333,  1.        ,  2.        ,  3.        ,
        2.33333333,  1.33333333])

这是一个包含 N+M-1 个元素的数组。只有 M-2(N-1) 种有效手段,这里是 [1,2,3],并且 N-1 开头和结尾重叠的手段:你也必须丢弃它们。

针对您的情况:

N = 3
a1 = [11,-5,54,-100,1]
a2 = [11,-5,54,-100,100]

mask=numpy.ones(N)/N
m1= numpy.convolve(a1, mask)[(N-1):-(N-1)]
m2= numpy.convolve(a2, mask)[(N-1):-(N-1)]
print (m1,m2)

# [ 20. -17. -15.] [ 20. -17.  18.]

只有最后一个学期受到影响。

编辑

为了避免 N-1 最后一项,另一种方法是使用 scipy.signal.lfilter,它实现差分方程:

在这里,mean(n) - mean(n-1) = data(n)/N -data(n-N)/N

from scipy.signal import lfilter
N=3
a=np.array([1,-1])
b=np.concatenate(([1],np.zeros(N-1),[-1]))/N
x=np.arange(5)
means=lfilter(b,a,x)
# array([0.,0.3333,1.,2.,3.])