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.])
我正在与 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.])