如何用xarray的sel、interp提取坐标对序列点而非二维数组
提取xarray Dataset中坐标对序列的对应数据(sel/interp方法优化)
我有一个xarray Dataset,想要提取坐标对序列(比如(x₁,y₁)、(x₂,y₂))对应的点数据。但用sel方法传入两组独立坐标时,会返回二维数组(这是方法的预期行为),不符合需求;同样,interp方法传入两组独立坐标也会得到二维插值结果,而非对应坐标对的插值序列。目前我通过列表推导式实现了需求,但希望直接用sel和interp方法完成。
原始示例问题
sel方法的问题示例
import xarray as xr import numpy as np ds = xr.Dataset( {'data': (('y', 'x'), np.linspace(1, 9, 9).reshape(3, 3))}, coords={ 'x': [0, 1, 2], 'y': [0, 1, 2] } ) xx = np.array([0, 1]) yy = np.array([1, 2]) # 返回二维数组,而非坐标对对应的序列 print(ds.sel(x=xx, y=yy).data.values) """ [[4. 5.] [7. 8.]] """ # 列表推导式实现需求,但不够简洁 [ds.sel(x=x, y=y).data.item() for x, y in zip(xx, yy)] """ [4.0, 8.0] """
interp方法的问题示例
xx = np.array([0.25, 1.25]) yy = np.array([0.75, 1.75]) # 返回二维插值结果,而非坐标对对应的插值序列 ds.interp(x=xx, y=yy).data.values """ array([[3.5, 4.5], [6.5, 7.5]]) """ # 列表推导式实现需求,但不够简洁 [ds.interp(x=x, y=y).data.item() for x, y in zip(xx, yy)] """ [3.5, 7.5] """
优化解决方案
针对sel方法的优化
通过给坐标数组添加统一的维度(比如points),让xarray自动对齐坐标对,避免生成笛卡尔积的二维网格:
xx = np.array([0, 1]) yy = np.array([1, 2]) # 给坐标新增统一的"points"维度,直接传入sel result_sel = ds.sel( x=xr.DataArray(xx, dims='points'), y=xr.DataArray(yy, dims='points') ).data.values.tolist() print(result_sel) # 输出: [4.0, 8.0]
或者用更直观的points参数(xarray版本≥0.17.0支持):
# 构造包含坐标对的points维度 points = xr.DataArray( np.arange(len(xx)), dims='points', coords={'x': ('points', xx), 'y': ('points', yy)} ) result_sel = ds.sel(points=points).data.values.tolist()
针对interp方法的优化
同样给插值坐标添加统一维度,让xarray按坐标对进行插值:
xx = np.array([0.25, 1.25]) yy = np.array([0.75, 1.75]) # 给坐标新增统一的"points"维度,直接传入interp result_interp = ds.interp( x=xr.DataArray(xx, dims='points'), y=xr.DataArray(yy, dims='points') ).data.values.tolist() print(result_interp) # 输出: [3.5, 7.5]
原理说明
当sel或interp接收的坐标数组带有相同的自定义维度时,xarray会将对应位置的坐标配对处理,而非生成所有坐标组合的二维网格,这样就能直接得到每个坐标对对应的结果序列,无需循环调用方法。
内容的提问来源于stack exchange,提问作者3dSpatialUser
相关产品推荐
相关产品推荐

