我再次使用Python玩,发现一本带有示例的简洁书。示例之一是绘制一些数据。我有两列的.txt文件,并且有数据。我对数据进行了很好的绘制,但是在练习中它说:进一步修改程序以计算和绘制数据的运行平均值,定义为:

$Y_k=\frac{1}{2r}\sum_{m=-r}^r y_{k+m}$

在这种情况下为r=5(而y_k是数据文件中的第二列)。让程序在同一图形上绘制原始数据和移动平均值。

到目前为止,我有这个:
from pylab import plot, ylim, xlim, show, xlabel, ylabel
from numpy import linspace, loadtxt

data = loadtxt("sunspots.txt", float)
r=5.0

x = data[:,0]
y = data[:,1]

plot(x,y)
xlim(0,1000)
xlabel("Months since Jan 1749.")
ylabel("No. of Sun spots")
show()

那么如何计算总和?在Mathematica中,它很简单,因为它是符号操作(例如Sum [i,{i,0,10}]),但是如何在python中计算求和,求和取数据中的每十个点并将其平均,直到最后点?

我看了看这本书,但什么也没能解释:\

heltonbiker的代码成功完成了^^:D
from __future__ import division
from pylab import plot, ylim, xlim, show, xlabel, ylabel, grid
from numpy import linspace, loadtxt, ones, convolve
import numpy as numpy

data = loadtxt("sunspots.txt", float)

def movingaverage(interval, window_size):
    window= numpy.ones(int(window_size))/float(window_size)
    return numpy.convolve(interval, window, 'same')

x = data[:,0]
y = data[:,1]


plot(x,y,"k.")
y_av = movingaverage(y, 10)
plot(x, y_av,"r")
xlim(0,1000)
xlabel("Months since Jan 1749.")
ylabel("No. of Sun spots")
grid(True)
show()

我得到了:

非常感谢你^^ :)

最佳答案



最佳的将移动/滑动平均值(或任何其他滑动窗口函数)应用于信号的一种常见方法是使用numpy.convolve()

def movingaverage(interval, window_size):
    window = numpy.ones(int(window_size))/float(window_size)
    return numpy.convolve(interval, window, 'same')

在这里,interval是您的x数组,而window_size是要考虑的样本数。该窗口将以每个样本为中心,因此它将在当前样本之前和之后获取样本,以计算平均值。您的代码将变为:
plot(x,y)
xlim(0,1000)

x_av = movingaverage(interval, r)
plot(x_av, y)

xlabel("Months since Jan 1749.")
ylabel("No. of Sun spots")
show()

希望这可以帮助!

关于python - 从Python中的数据点查找移动平均值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11352047/

10-09 09:03
查看更多