爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 34381|回复: 13

[经验总结] 粗分辨率格点插值到细分辨率格点

[复制链接]

新浪微博达人勋

发表于 2021-6-27 21:03:30 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

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. ]]

1.png
2.png
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2021-6-29 13:47:04 | 显示全部楼层
感谢分享~
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2021-7-2 16:20:32 | 显示全部楼层
x1,y1是一维    d1是二维  这样也可以吗    还没试过
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2021-7-2 21:34:32 | 显示全部楼层
淡水河 发表于 2021-7-2 16:20
x1,y1是一维    d1是二维  这样也可以吗    还没试过

这个好像是跟ax.contourf(x,y,t)这种的类似,我之前一直以为x,y,t都是要二维的,x,y要np.meshgrid,但其实可以不用特地弄成二维的,一维也能运行。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2021-7-5 12:20:47 | 显示全部楼层
学习了
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2021-7-8 18:49:21 | 显示全部楼层
时间*经度*纬度的三维数组插值是不是要用interpn函数了?
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2021-7-10 10:58:03 | 显示全部楼层
岫鹿森涌 发表于 2021-7-8 18:49
时间*经度*纬度的三维数组插值是不是要用interpn函数了?

好像不是的,那个interpn是输入站点数据的(当然你可以把格点的经纬度高度之类的输入进去)。当然,如果你要插值这种三维的话,其实你可以写个for循环,在时间纬循环,然后每个时次下就是二维的了,就可以用这个函数插值了。最后把插值出来的二维场堆叠起来就回到三维了。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2021-7-15 20:40:22 | 显示全部楼层
雨落森林 发表于 2021-7-10 10:58
好像不是的,那个interpn是输入站点数据的(当然你可以把格点的经纬度高度之类的输入进去)。当然,如果 ...

D:\屏幕截图 2021-07-15 203738.png

时间*层次*经度*纬度的四维数组的插值之后,eof分析报错了,想问一下我这样插值是对的吗
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2021-7-15 20:42:48 | 显示全部楼层
岫鹿森涌 发表于 2021-7-15 20:40
时间*层次*经度*纬度的四维数组的插值之后,eof分析报错了,想问一下我这样插值是对的吗
  1. d2=np.zeros((684,19,35,180),dtype=float)
  2. for i in range(0,684):
  3.     for j in range(0,19):
  4.         f=interpolate.interp2d(lon,lat1,zg11[i,j,:,:],kind='linear')
  5.     #x2和y2是待插值的经纬度,现在用0.5的分辨率组成的网格
  6.         x2, y2 =  np.arange(0.9375,359.1,2),np.arange(20,89.38,2)
  7.     #直接使用f函数把x2和y2上的格点插值出来
  8.         d2[i,j,:,:] = f(x2,y2)
  9.     #输出结果看看
  10. print(d2)
复制代码
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2021-7-15 21:11:28 | 显示全部楼层
哦哦,我明白了,权重函数我没改,改了之后就对啦
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表