- 积分
- 10308
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2019-7-29
- 最后登录
- 1970-1-1
|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 雨落森林 于 2021-6-27 21:21 编辑
假如现有的气温数据是分辨率为1°×1°的格点数据,但却需要插值0.25°×0.25°的格点数据。这个问题我之前做大创项目的时候就遇到过,当时是自己手写了一个双线性插值的函数。但是技术有限,没法用矩阵操作加速,是用for循环一个点一个点地插值,太慢了。现在在研究scipy的插值函数,意外发现了一个叫interp2d的插值函数,因此现在学习和记录一下,废话不多说,直接上代码和图。
import scipy.interpolate as inter
import numpy as np
if __name__=='__main__':
#d1是数据,x1和y1表示分辨率为1°的经纬度
d1 = np.array([[0,3,6,9],[2,5,8,11],[4,7,10,13]])
x1, y1 = np.arange(110,114), np.arange(10,13)
#使用interp2d建立插值函数为f,其中的kind参数可以是'linear',
# 'cubic', 'quintic'这三种,默认是linear线性插值
f = inter.interp2d(x1,y1,d1,kind='linear')
#x2和y2是待插值的经纬度,现在用0.5的分辨率组成的网格
x2, y2 = np.arange(110,114,0.5), np.arange(10,13,0.5)
#直接使用f函数把x2和y2上的格点插值出来
d2 = f(x2,y2)
#输出结果看看
print(d1,'\n')
print(d2)
结果:
[[ 0 3 6 9]
[ 2 5 8 11]
[ 4 7 10 13]]
[[ 0. 1.5 3. 4.5 6. 7.5 9. 9. ]
[ 1. 2.5 4. 5.5 7. 8.5 10. 10. ]
[ 2. 3.5 5. 6.5 8. 9.5 11. 11. ]
[ 3. 4.5 6. 7.5 9. 10.5 12. 12. ]
[ 4. 5.5 7. 8.5 10. 11.5 13. 13. ]
[ 4. 5.5 7. 8.5 10. 11.5 13. 13. ]]
|
|