使用matplotlib平滑列表

时间:2014-10-30 22:32:45

标签: python matplotlib scipy

我有很长的奖励信号列表(丢失为-1,领带为0,胜利为+1)。我想在" windows"中平均这些信号。然后平滑此结果曲线以显示进度。我如何用matplotlib / scipy做到这一点?

我的代码如:

#!/usr/bin/env python
import matplotlib
matplotlib.rcParams['backend'] = "Qt4Agg"

import matplotlib.pyplot as plt
import numpy as np

y = np.array([-1, 1, 0, -1, -1, -1, 1, 1, 1, 1, 0, 0, 0, 1, 1, -1, 1, 1, -1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, -1, 1, 1, 0, 1, 1, 0, 1, -1, -1, 1, -1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, -1, 0, 1, 1, 1, -1, 1, 1, 1, 1, 0, -1, 0, 1, 0, 1, 1, 1, -1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, -1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1]
)
x = np.array(xrange(len(y)))

plt.plot(x,y)
plt.show()

我尝试了类似问题的解决方案,例如this,它推荐使用样条曲线,但是当应用于我的数据时,会消耗我的所有内存并使我的机器崩溃。

2 个答案:

答案 0 :(得分:3)

在某些时候我发现了这个地方。我在查找源代码时遇到问题,但是我用它来编译各种窗口的1d ndarray,并且应该解决你的问题。

def smooth(x,window_len=11,window='hanning'):

    if x.ndim != 1:
        raise ValueError, "smooth only accepts 1 dimension arrays."
    if x.size < window_len:
        raise ValueError, "Input vector needs to be bigger than window size."
    if window_len<3:
        return x
    if not window in ['flat', 'hanning', 'hamming', 'bartlett', 'blackman']:
        raise ValueError, "Window is on of 'flat', 'hanning', 'hamming', 'bartlett', 'blackman'"

    s=numpy.r_[x[window_len-1:0:-1],x,x[-1:-window_len:-1]]

    if window == 'flat': #moving average
        w=numpy.ones(window_len,'d')
    else:
        w=eval('numpy.'+window+'(window_len)')

    y=numpy.convolve(w/w.sum(),s,mode='valid')
    return y

例如,您可以使用您的数据:

plt.plot(smooth(y))
plt.show()

你得到: smoothed

答案 1 :(得分:1)

您链接的答案建议使用scipy.interpolate.spline使用完整矩阵构造b样条曲线表示。这就是它消耗这么多内存的原因。如果平滑样条曲线是你所追求的,那么现在你最好使用scipy.interpolate.UnivariateSpline,它应该有更好的内存占用。

如果您需要一些窗口平均值/卷积,请查看scipy.signal中的numpy.convolve和/或卷积/窗口功能。