多维上的xarray点插值

时间:2019-05-15 08:22:48

标签: python-xarray

我正在尝试直接使用xarray从3D数据集(lon,lat,time)内插信息。

当我仅用一个点进行简单插值时,我一点都没有问题。

lat = [44.25]
lon = [-4.5]
t = datetime.strptime('2000-02-28 01:00:00', '%Y-%m-%d %H:%M:%S')

ds = xr.open_dataset('file.nc')
vx = ds['uo_surface'].interp(longitude=lon, latitude=lat, time=t)

但是现在我正尝试以相同的方式对多个点进行插值,并且使用相同语法进行此操作的结果将显示出更多的预期结果。

lat = [44.25, 45.25]
lon = [-4.5, -5]
t = datetime.strptime('2000-02-28 01:00:00', '%Y-%m-%d %H:%M:%S')

ds = xr.open_dataset('Currents\oceanTESEO.nc')
vx = ds['uo_surface'].interp(longitude=lon, latitude=lat, time=[t, t])

结果是这个数组:

array([[[0.01750018, 0.05349977],
        [0.03699994, 0.11299999]],

       [[0.01750018, 0.05349977],
        [0.03699994, 0.11299999]]])

但是,我期望只有2个值,每个(lon,lat,t)点一个。 我必须实现一个循环来做到这一点吗?我猜想这个功能已经包含在xarray中。 您知道其他方法可以更快地使用4D数据(lon,lat,z,time)来计算这种点插值吗?

预先感谢您!

1 个答案:

答案 0 :(得分:1)

是的,有可能。

乍一看,它有点“不太直观”,但功能强大,并在此处记录:http://xarray.pydata.org/en/stable/interpolation.html#advanced-interpolation

您需要拨打的电话是:

ds['uo_surface'].interp(longitude=('z', lon), latitude=('z', lat), 
                        time=('z', [t, t]))

这实现了“向量化”索引编制,而在您先前的呼叫中,您正在进行“正交”索引编制。有关更多信息,请参见http://xarray.pydata.org/en/stable/indexing.html#vectorized-indexing