写在最前:今天处理一组数据,每条数据长度不一样,打算重采样成相同长度。在浏览器搜索“ resample ”,但是一直找不到我想要那种方法。捣腾了很长时间,结果一直不理想。最后打算自己做线性插值,然后再采样,最终找到了scipy.interpolate.interp1d()函数,这其实才是我想要的重采样,因此写下这篇博客,对比了scipy.signal.resample()方法和scipy.interpolate.interp1d()方法,以便以后再用。

不等间隔 数据 等间隔 重采样

目的:对下面这样的一个信号进行重采样

t = np.array([0.001, 0.002, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10,15,20])
x = np.exp(-t / 3.0)
plt.plot(t,x,'o--')
plt.show()

在这里插入图片描述

方法一:scipy.signal.resample

上采样

15个点采成20个点

t = np.array([0.001, 0.002, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10,15,20])
x = np.exp(-t / 3.0)
print(f'原始数据长度:{len(x)}')
plt.plot(t,x,'o--',label='raw')


#使用resample
re_x = signal.resample(x,20)
t1 = np.linspace(0.001,20,20,endpoint=True)
plt.plot(t1,re_x,'*--',label='resample')
plt.show()

在这里插入图片描述
效果有点惨不忍睹。因为scipy.signal.resample()只能处理等间隔的输入。

下采样

15个点采成10个点
15个点下采样成10个点也一样,结果惨不忍睹。
在这里插入图片描述

方法二:插值重采样

这里用到了scipy.interpolate.interp1()方法。直接上代码:

f = interpolate.interp1d(t, x,kind='quadratic')
# kind可选“linear”、“nearest”、“nearest-up”、“zero”、“slinear”、“quadratic”、“cubic”、“previous”或“next”之一。
# “zero”、“slinear”、“quadratic”、“cubic”是指零阶、一阶、二阶或三阶样条插值; 
#“previous”或“next”简单地返回该点的上一个或下一个值; 
#在插入半整数(例如 0.5、1.5)时,“nearest-up”和“nearest”不同,“nearest-up”向上舍入,“nearest”向下舍入。 
#kind默认为“线性”。
tnew = np.linspace(0.001, 20, 20)
xnew = f(tnew)
print(f'重采样长度:{len(xnew)}')

plt.plot(tnew,xnew,'*-')
plt.show()

在这里插入图片描述


等间隔 数据 等间隔 重采样

方法一:scipy.signal.resample

上采样

15个点采成20个点

t = np.linspace(0.001,20,15)
x = np.exp(-t / 3.0)
print(f'原始数据长度:{len(x)}')
plt.plot(t,x,'o--',label='raw')


#使用resample
re_x = signal.resample(x,20)
t1 = np.linspace(0.001,20,20,endpoint=True)
plt.plot(t1,re_x,'*--',label='resample')
plt.show()
print(f'重采样长度:{len(re_x)}')

在这里插入图片描述

下采样

15个点采成10个点
在这里插入图片描述

scipy.signal.resample()方法总结

可以看出,scipy.signal.resample()方法可能并不是我们想要的重采样方法。scipy.signal.resample()方法在 起点 终点 附近会出现很大的 振荡 ,因为这个方法使用Fourier方法进行重采样的(我也不知道Fourier方法是什么),它假设我们要重采样的信号具有周期性。官方文档是这样说的:Because a Fourier method is used, the signal is assumed to be periodic.
然而,我们想要的重采样可能是长下面这样的:

上采样
下采样
这其实用到的是插值重采样的方法,代码如方法二

方法二:插值重采样

t = np.linspace(0.001,20,15)
x = np.exp(-t / 3.0)
print(f'原始数据长度:{len(x)}')
plt.plot(t,x,'o--',label='raw')


f = interpolate.interp1d(t, x,kind='quadratic')
tnew = np.linspace(0.001, 20, 10)
xnew = f(tnew)
print(f'重采样长度:{len(xnew)}')

plt.plot(tnew,xnew,'*-')
plt.show()

觉得有用的小伙伴点个赞呗
在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐