1

我有一个维度为(时间=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 中,我尝试了interp2dmap_coordinatesinterp(basemap) 函数,但没有成功。

这是我的代码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 新手,如果能帮助我解决这个问题,我将不胜感激。

4

4 回答 4

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)

希望这可以帮助。干杯,特隆德

于 2013-07-02T19:53:26.513 回答
1

我会调查的scipy.interpolate。看起来griddata可能是您需要的。

于 2013-07-02T19:51:19.163 回答
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))
于 2013-07-03T17:35:42.117 回答
0

如果您想要普通克里金插值,另一个选择是 PyKrige 库!

于 2020-06-10T15:12:52.723 回答