[英]Old numbers can't change in numpy.convolve and Python
我正在使用numpy.convolve。 老实说,我不确定我是否为我正在使用的项目使用正确的模块。
我希望numpy卷积(或者如果可以实现其他模块)不要更改以前的数字。 我不想改变旧的数字,我希望将它们固定下来。 因此,当我获得新数据时,唯一应该影响的数字是新数字,而不是其余数字。
这是一个例子,以澄清:
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]
但是,当我将最后一个数字更改为100而不是1时,结果将更改所有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。这不是我想要的,我希望所有这些数字都是固定的,并且没有一个改变的唯一数字应该是最新的。 在这种情况下为0.3333的33.333333
有什么模块或方法可以在Python中实现吗?
您要计算3邻域均值。 因此,您有一个mask=[1./3,1./3,1./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(nN)/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.])
我不是一个麻木的专家,所以我将为您提出一个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])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.