如何创建维度名与坐标名一致的xarray.DataArray并正常使用.sel方法
xarray创建维度与坐标同名DataArray的解决方案
核心报错原因
xarray禁止与维度同名的坐标为多维数组,你遇到的冲突本质是误用了np.meshgrid生成二维经纬度坐标。你接触到的ERA5等公开再分析数据属于规则正交格点,其经纬度坐标本身是一维的,和同名维度一一对应,天然支持.sel()方法,不需要生成二维坐标。
方案1:规则格点场景(推荐,和ERA5用法完全一致)
直接使用一维经纬度值定义同名坐标即可,无需调用np.meshgrid:
import numpy as np import xarray as xr data = [[23, 22, 21], [22, 20, 24]] # 直接定义一维经纬度坐标 lon_vals = [-45, -44, -43] lat_vals = [-21, -20] t2m = xr.DataArray( data=data, # 维度顺序和data形状对应:2行对应lat的2个值,3列对应lon的3个值 dims=["lat", "lon"], coords=dict( lon=lon_vals, lat=lat_vals ) )
验证.sel()方法调用:
# 直接按经纬度查询,和ERA5用法完全一致 print(t2m.sel(lon=-45, lat=-21, method='nearest'))
方案2:非规则格点场景(经纬度为二维数组)
如果你的数据确实是投影后的扭曲非规则格点,经纬度本身是二维的,不能和维度同名,此时可以用.where()方法实现坐标筛选,效果和.sel()一致:
import numpy as np import xarray as xr data = [[23, 22, 21], [22, 20, 24]] x, y = np.meshgrid([-45, -44, -43], [-21, -20]) # 维度使用不同名的x/y,经纬度为二维坐标 t2m = xr.DataArray( data=data, dims=["x", "y"], coords=dict( lon=(["x", "y"], x), lat=(["x", "y"], y) ) ) # 精确匹配坐标查询 result = t2m.where((t2m.lon == -45) & (t2m.lat == -21), drop=True) # 近邻匹配查询(对应method='nearest'效果) lon_target = -45 lat_target = -21 dist = np.sqrt((t2m.lon - lon_target)**2 + (t2m.lat - lat_target)**2) result = t2m.where(dist == dist.min(), drop=True)
内容的提问来源于stack exchange,提问作者Robson Barreto
相关产品推荐
相关产品推荐

