如何根据x、y坐标对应的纬度函数生成网格点可用纬度数组
问题原因
你当前生成的lats列表元素是0维numpy数组,而非普通数值标量,因此后续调用时会出现格式兼容问题。计算可得349*277=96673,列表长度本身符合预期,仅元素类型不符合要求。
解决方案
方案1:修正原有循环代码
只需要提取0维数组里的实际数值即可,注意不要把循环变量和坐标对象重名避免冲突:
import numpy as np import xarray as xr lats = [] lons = [] for x_val in df.x: for y_val in df.y: # 用.item()将0维numpy数组转为原生数值 lat_val = df.sel(x=x_val, y=y_val).lat.values.item() lon_val = df.sel(x=x_val, y=y_val).lon.values.item() lats.append(lat_val) lons.append(lon_val) # 如需numpy格式一维数组,直接转换即可 lats_arr = np.array(lats) lons_arr = np.array(lons)
转换完成后lats_arr.shape即为(96673,),可以直接调用。
方案2:无循环原生实现(推荐)
双层循环逐点取值效率极低,xarray本身提供了维度操作接口,不需要逐点取值,运行速度比循环高两个量级,也不会出现元素格式错误:
- 如果你的
lat/lon已经是和x/y维度对齐的二维变量,直接拉平即可:
lats_arr = df.lat.values.flatten() lons_arr = df.lon.values.flatten()
- 如果
lat/lon没有和维度自动对齐,用stack方法先堆叠网格维度再取值:
# 将x、y两个维度堆叠为单个网格点维度 stacked_ds = df.stack(grid_point=("x", "y")) lats_arr = stacked_ds.lat.values lons_arr = stacked_ds.lon.values
上述代码输出的结果直接是shape为(96673,)的一维numpy数组,不需要额外做格式转换。
结果校验
拿到数组后可以直接打印维度确认:
print(lats_arr.shape) # 输出(96673,)即为符合要求的可用数组
内容的提问来源于stack exchange,提问作者Megan Martin
相关产品推荐
相关产品推荐

