MATLAB';在NumPy/Python中实现s平滑(n点移动平均)

MATLAB';在NumPy/Python中实现s平滑(n点移动平均),python,matlab,numpy,scipy,smooth,Python,Matlab,Numpy,Scipy,Smooth,默认情况下,Matlab的smooth函数使用5点移动平均值平滑数据。在python中,做同样事情的最佳方法是什么? 例如,如果这是我的数据 0 0.823529411764706 0.852941176470588 0.705882352941177 0.705882352941177 0.676470588235294 0.676470588235294 0.500000000000000 0.558823529411765 0.647058823529412 0.7058823529411

默认情况下,Matlab的
smooth
函数使用5点移动平均值平滑数据。在python中,做同样事情的最佳方法是什么? 例如,如果这是我的数据

0
0.823529411764706
0.852941176470588
0.705882352941177
0.705882352941177
0.676470588235294
0.676470588235294
0.500000000000000
0.558823529411765
0.647058823529412
0.705882352941177
0.705882352941177
0.617647058823529
0.705882352941177
0.735294117647059
0.735294117647059
0.588235294117647
0.588235294117647
1
0.647058823529412
0.705882352941177
0.764705882352941
0.823529411764706
0.647058823529412
0.735294117647059
0.794117647058824
0.794117647058824
0.705882352941177
0.676470588235294
0.794117647058824
0.852941176470588
0.735294117647059
0.647058823529412
0.647058823529412
0.676470588235294
0.676470588235294
0.529411764705882
0.676470588235294
0.794117647058824
0.882352941176471
0.735294117647059
0.852941176470588
0.823529411764706
0.764705882352941
0.558823529411765
0.588235294117647
0.617647058823529
0.647058823529412
0.588235294117647
0.617647058823529
0.647058823529412
0.794117647058824
0.823529411764706
0.647058823529412
0.617647058823529
0.647058823529412
0.676470588235294
0.764705882352941
0.676470588235294
0.647058823529412
0.705882352941177
0.764705882352941
0.705882352941177
0.500000000000000
0.529411764705882
0.529411764705882
0.647058823529412
0.676470588235294
0.588235294117647
0.735294117647059
0.794117647058824
0.852941176470588
0.764705882352941
平滑后的数据应该是

0
0.558823529411765
0.617647058823530
0.752941176470588
0.723529411764706
0.652941176470588
0.623529411764706
0.611764705882353
0.617647058823530
0.623529411764706
0.647058823529412
0.676470588235294
0.694117647058824
0.700000000000000
0.676470588235294
0.670588235294118
0.729411764705882
0.711764705882353
0.705882352941177
0.741176470588235
0.788235294117647
0.717647058823529
0.735294117647059
0.752941176470588
0.758823529411765
0.735294117647059
0.741176470588235
0.752941176470588
0.764705882352941
0.752941176470588
0.741176470588235
0.735294117647059
0.711764705882353
0.676470588235294
0.635294117647059
0.641176470588236
0.670588235294118
0.711764705882353
0.723529411764706
0.788235294117647
0.817647058823530
0.811764705882353
0.747058823529412
0.717647058823530
0.670588235294118
0.635294117647059
0.600000000000000
0.611764705882353
0.623529411764706
0.658823529411765
0.694117647058824
0.705882352941176
0.705882352941176
0.705882352941176
0.682352941176471
0.670588235294118
0.676470588235294
0.682352941176471
0.694117647058824
0.711764705882353
0.700000000000000
0.664705882352941
0.641176470588236
0.605882352941177
0.582352941176471
0.576470588235294
0.594117647058824
0.635294117647059
0.688235294117647
0.729411764705882
0.747058823529412
0.803921568627451
0.764705882352941
Matlab中的语法是

smooth(data)
我想在python中也这样做,但我找不到任何函数可以做到这一点。

MATLAB的基本上与在长度为
5
的滑动窗口中求平均值相同,只是它处理两端的两个元素的方式不同。根据链接的文档,使用这些公式计算这些边界情况-

因此,为了在NumPy/Python上复制相同的实现,我们可以使用滑动窗口求和,然后将它们除以窗口长度,得到平均结果。然后,只需为边界元素附加经过特殊情况处理的值

因此,我们将有一个处理通用窗口大小的实现,如下所示-

def smooth(a,WSZ):
    # a: NumPy 1-D array containing the data to be smoothed
    # WSZ: smoothing window size needs, which must be odd number,
    # as in the original MATLAB implementation
    out0 = np.convolve(a,np.ones(WSZ,dtype=int),'valid')/WSZ    
    r = np.arange(1,WSZ-1,2)
    start = np.cumsum(a[:WSZ-1])[::2]/r
    stop = (np.cumsum(a[:-WSZ:-1])[::2]/r)[::-1]
    return np.concatenate((  start , out0, stop  ))

这个问题和吗?@BillBell我不认为还有其他一些例子:非常感谢@Divakar。但是当我尝试使用函数“smooth”时,我得到了以下错误:“AttributeError:”list“对象没有属性“cumsum”@rsnaveen我假设
a
是一个NumPy数组。修复了处理数组和列表的问题。非常感谢@Divakar。如果我复制并通过您的解决方案并在numpy数组上运行它,我会得到start=np.cumsum(a[:WSZ-1])[::2]/r ValueError:操作数不能与形状(150),(149),@ErroriSalvo一起广播,因为它需要一个奇数窗口大小,如中所述。上面写着-
“yy=smooth(y,span)将移动平均线的跨度设置为span。span必须是奇数。”
。所以,在这里对WSZ使用奇数。
def smooth(a,WSZ):
    # a: NumPy 1-D array containing the data to be smoothed
    # WSZ: smoothing window size needs, which must be odd number,
    # as in the original MATLAB implementation
    out0 = np.convolve(a,np.ones(WSZ,dtype=int),'valid')/WSZ    
    r = np.arange(1,WSZ-1,2)
    start = np.cumsum(a[:WSZ-1])[::2]/r
    stop = (np.cumsum(a[:-WSZ:-1])[::2]/r)[::-1]
    return np.concatenate((  start , out0, stop  ))