平滑数据的一个简单方法是使用moving average算法。移动平均的一种简单形式是计算某一位置相邻测量值的平均值。例如,在一维测量序列a[1:N]中,a[N]处的移动平均值可以计算为a[N]=(a[N-1]+a[N]+a[N+1])/3。如果你检查了所有的测量,你就完成了。在这个简单的例子中,我们的平均窗口的大小是3。也可以使用不同大小的窗口,具体取决于所需的平滑程度。
为了在更广泛的应用程序中使计算更简单、更快,还可以使用基于convolution的算法。使用卷积的优点是,只需更改窗口,就可以选择不同类型的平均值,如加权平均值。
让我们做一些代码来说明。以下摘录需要安装Numpy、Matplotlib和Scipy。Click here用于完整运行的示例代码from __future__ import division
import numpy
import pylab
from scipy.signal import convolve2d
def moving_average_2d(data, window):
"""Moving average on two-dimensional data.
"""
# Makes sure that the window function is normalized.
window /= window.sum()
# Makes sure data array is a numpy array or masked array.
if type(data).__name__ not in ['ndarray', 'MaskedArray']:
data = numpy.asa