有没有像 interp 这样的 python xarray 函数来查找与变量值匹配的最接近的坐标值?

Is there a python xarray function, like interp, to lookup the closest coordinate value that matches a variable value?

我正在寻找一种方法来 return 查询变量值处的变量的内插坐标值。我认为它与正常 interpolation/table-look up 的用法相反。

例如,这是一个简单的普通插值, 从这个很好tutorial:

x_data = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
f = xr.DataArray(x_data**2, dims=['x'], coords={'x': x_data})
f.plot(marker='o')

产生这个情节:

因此,标准查找(例如 f.interp(x=4.5))会在 x 的某个坐标值处查找变量的值。但我想寻找变量等于某个值的 x 的值。例如在上图中,变量等于 20.

x 的值是多少

我最终会尝试针对 3D 温度场(经度 x 纬度 x 深度)执行此操作。那么,如何找到温度场最接近我指定值的深度值。

非常感谢。

我找到了一种使用 scipy.interpolate 解决此问题的简单方法,该方法有效,但计算速度相对较慢。

from scipy import interpolate

ii = interpolate.interp1d(np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])**2,np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]))
ii(20)

其中 returns array(4.44444444).

我认为这是一个答案,它可能会对某些人有所帮助,但不是理想的答案。理想情况下,这可以以 pythonic 方式完成,也许使用 xarray 模块。

要将其扩展到 3D,我必须在 2 for-loops 内循环它,如下所示:

def calc_depthToTempROMS(tempfield,depthfield,queryfield,xxlims,eelims):
    ## the two input fields are the tempfield (equivalent to the coordinates) and the depthfield (equivalent to the function to be interpolated). 
    ## queryfield is the values of temperature to interpolate for depth.
    ## xxlims and eelims are the for-loop bounds, which are model specific
    for xx in xxlims:
        for ee in eelims:
            ii = interpolate.interp1d(tempfield.isel(xi_rho=xx,eta_rho=ee),depthfield.isel(xi_rho=xx,eta_rho=ee)) # make the interpolator
            depthTC[dict(eta_rho=ee,xi_rho=xx)] = ii(queryfield.isel(xi_rho=xx,eta_rho=ee)) # interpolate for each location
        if xx.values in np.round(np.linspace(0,len(xxlims.values),10)):
            print(xx.values) # print every 10th index to monitor progress
    return depthTC


depthTC = (truth.tempTC.mean(dim='ocean_time')*np.nan).load() # initialise an empty matrix
tempfield = truth.temp.mean(dim='ocean_time').load() # coordinates
depthfield = truth.z_rho0.load() # function to interpolate
queryfield = truth.tempTC.mean(dim='ocean_time').load() # target coordinate
xxlims = truth.xi_rho.load()
eelims = truth.eta_rho.load()

depthTC = calc_depthToTempROMS(tempfield,depthfield,queryfield,xxlims,eelims)

使用 xarray 处理地球科学模型数据的其他人可能会发现上面的代码很有用。

我暂时不接受这个 - 希望有人能想出一个更好的、基于 xarray 的方法来实现这个。