xarray用swap_dims转2D经纬度为维度报错及NCO重网格适配咨询
问题1:xarray二维坐标换维度实现
首先明确:当前xarray的swap_dims仅支持1D坐标与维度的替换,你的lon、lat是二维坐标,不符合接口要求,所以报错是设计如此,目前没有原生的二维坐标直接替换双维度的API。
由于你的数据是兰勃特投影下的规则正交网格,二维lon/lat是1D经纬序列的外积,你可以通过以下步骤实现你要的数据集结构:
- 第一步:提取1D经纬坐标
规则投影网格中,固定任意west_east位置,沿south_north维度的lat序列即为和south_north等长的1D纬度坐标;同理固定任意south_north位置,沿west_east维度的lon序列即为1D经度坐标,可通过以下代码提取:import numpy as np # 提取1D纬度,可随机取west_east的任意索引,规则网格结果一致 lat_1d = ds.lat.isel(west_east=0).values # 提取1D经度,可随机取south_north的任意索引 lon_1d = ds.lon.isel(south_north=0).values # 可选校验:确认所有列的lat序列一致,所有行的lon序列一致 assert np.allclose(ds.lat.isel(west_east=-1), lat_1d) assert np.allclose(ds.lon.isel(south_north=-1), lon_1d) - 第二步:重命名维度并分配新坐标
执行完成后得到的# 重命名维度 ds_new = ds.rename_dims({"south_north": "lat", "west_east": "lon"}) # 给新维度分配1D坐标 ds_new = ds_new.assign_coords(lat=lat_1d, lon=lon_1d)ds_new结构和你预期的完全一致,west_east、south_north会自动变为(lat, lon)维度下的二维坐标。
关于该功能的可行性:该需求仅适用于规则投影网格的特殊场景,非规则网格的二维坐标无法直接映射为两个1D维度,所以不属于xarray要实现的通用特性,暂时没有相关开发计划。
问题2:NCO直接生成网格文件方案
你不需要修改数据集的维度结构,只要给数据集补充CF标准的投影属性,就可以直接用ncks生成SCRIP网格文件,操作更简便:
- 第一步:补全投影属性
给数据集中的Lambert_Conformal变量补充你已有的兰勃特投影配置参数,必填的CF属性包括:grid_mapping_name(值为lambert_conformal_conic)、false_easting、false_northing、latitude_of_projection_origin、longitude_of_central_meridian、standard_parallel,同时给precip_bkt变量添加属性grid_mapping = "Lambert_Conformal",告诉NCO变量对应的投影配置。 - 第二步:直接运行重网格推断命令
完成属性补充后直接执行你原来的命令即可:
NCO的重网格化模块会自动识别CF标准的投影信息,直接用二维ncks --rgr infer --rgr scrip=output_scrip.nc your_input.nc dummy_output.nclon/lat坐标生成网格描述文件,不需要将维度改为lat/lon。
如果不想修改原文件的属性,也可以用ncremap直接指定投影参数生成scrip文件,命令如下:
ncremap --src_grd=your_input.nc --dst_grd=output_scrip.nc --rgr infer --rgr proj=lambert --rgr <你的投影参数键值对>
内容的提问来源于stack exchange,提问作者Gheorghe Smintinescu
相关产品推荐
相关产品推荐

