scipy 插值重采样

写在最前:今天处理一组数据,每条数据长度不一样,打算重采样成相同长度。在浏览器搜索“ 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()

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

  • 26
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python是一种强大的编程语言,拥有丰富的库和工具,可以用来进行各种数据处理任务。如果要批量重采样tif文件,可以使用Python中的一些库来实现。 首先,可以使用GDAL库来读取和处理tif文件。GDAL是一个用于地理空间数据处理的开源库,可以对栅格数据进行各种操作。可以使用`gdal.Open`函数打开tif文件,然后使用`ReadAsArray`方法将栅格数据读取为数组。 接下来,可以使用`scipy`库中的`ndimage.zoom`函数来对数组进行重采样。`ndimage.zoom`函数可以按照指定的倍数对数组进行插值操作,实现重采样效果。可以传入一个包含重采样倍数的元组参数给`ndimage.zoom`函数,例如`(2, 2, 1)`表示在x和y方向上放大两倍,z方向不变。 最后,可以使用GDAL库再次将重采样后的数组保存为tif文件。使用`gdal.GetDriverByName`函数获取一个输出驱动,例如`GTiff`表示保存为tif文件格式。然后使用`Create`方法创建一个输出文件,指定文件名、宽度、高度、波段数等参数。接着可以使用`WriteArray`方法将数组写入文件中,最后使用`FlushCache`和`None`作为参数调用`FlushCache`方法,确保数据被写入文件。 总结起来,批量重采样tif文件的步骤如下: 1. 使用GDAL库打开tif文件并读取为数组。 2. 使用ndimage.zoom函数对数组进行重采样。 3. 使用GDAL库再次将重采样后的数组保存为tif文件。 希望这些信息能够帮助到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值