我有一个维度的全球降水数据(时间= 410,纬度= 72,离子= 144)。我希望将lat插值为180和lon至360(即将数据从2.5度缩小到1度)。
在Matlab我曾经做过:
%LAT,LON,XI,YI are old and new meshgridded lat-lons
for t = 1:size(precip,1)
newPrecip(t,:,:)=interp2(LON,LAT,squeeze(precip(t,:,:)),XI,YI);
end
在python中,我尝试了interp2d
,map_coordinates
和interp
(底图)功能,但没有成功。
这是我的代码map_coordinates
,这让我最接近结果
new_indicies = np.mgrid[0:410, -89.5:89.5:180J, -179.5:179.5:360J]
newPrecip = ndimage.map_coordinates(precip, new_indicies, order=1)
新数据确实具有我想要的尺寸(410,180,360),但它实际上没有内插,而只是用0值填充新添加的网格(在原始数据周围)。
我是python的新手,我很感激为解决这个问题提供任何帮助。
答案 0 :(得分:2)
我通常使用Basemap附带的插值例程。
import mpl_toolkits.basemap as mp
Zg = mp.interp(dataIN,lonIN,latIN,lonOUT,latOUT,
checkbounds=False, masked=False, order=1)
这里,lonIN和latIN是原始网格的1D经度 - 纬度(假设是规则网格),dataIn是原始数据的2D数组,lonOUT和latOUT是要插入的2D网格,而Zg是输出新网格。可以使用以下命令创建输出网格:
x=np.arange(-180,180,1)
y=np.arange(-90,90,1)
lonOUT,latOUT=np.meshgrid(x,y)
希望这会有所帮助。干杯,特隆德
答案 1 :(得分:1)
我会调查scipy.interpolate
。看起来griddata可能就是您所需要的。
答案 2 :(得分:1)
感谢Trond,我意识到我做错了什么。这是最适合我的代码。希望它可以作为其他人的参考。这是我第一次在Stackoverflow发布,并且非常高兴我的查询能够快速准确地得到解答!
#this code assumes a input data 'precip' of dimensions (410,72,144)
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import interp
LAT=np.arange(-89.5,90.5,1)
LON=np.arange(-179.5,180.5,1)
LON,LAT=np.meshgrid(LON,LAT)
lat=np.arange(-88.75,91.25,2.5)
lon=np.arange(-178.75,181.25,2.5)
newPrecip=np.zeros((410,180,360), dtype='float')
for i in range(410):
newPrecip[i,:,:]=interp(np.squeeze(precip[i,:,:]),lon,lat,LON,LAT,order=1)
plt.figure(1)
plt.pcolor(lon,lat,precip.mean(axis=0))
plt.figure(2)
plt.pcolor(LON,LAT,newPrecip.mean(axis=0))
答案 3 :(得分:0)
如果您想要普通克里金插值,另一个选择是PyKrige库!