我有很长的奖励信号列表(丢失为-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,它推荐使用样条曲线,但是当应用于我的数据时,会消耗我的所有内存并使我的机器崩溃。
答案 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()
你得到:
答案 1 :(得分:1)
您链接的答案建议使用scipy.interpolate.spline
使用完整矩阵构造b样条曲线表示。这就是它消耗这么多内存的原因。如果平滑样条曲线是你所追求的,那么现在你最好使用scipy.interpolate.UnivariateSpline
,它应该有更好的内存占用。
如果您需要一些窗口平均值/卷积,请查看scipy.signal
中的numpy.convolve
和/或卷积/窗口功能。