如何将GOLD卫星NetCDF数据的2D经纬度重格化为1D并选取研究区域?
GOLD卫星2D经纬度转1D及区域筛选优化方案
核心结论
完全可以将2D经纬度数组转换为标准1D维度,同时可以简化你当前的区域筛选代码,避免不必要的nan操作。
一、2D经纬度转1D的两种方法
根据GOLD卫星数据的网格类型(规则/不规则),选择对应方法:
1. 规则网格场景(最常见)
多数卫星数据的2D经纬度是规则网格:每一列纬度值一致,每一行经度值一致。直接提取单列/单行即可得到1D数组:
import numpy as np # 提取1D纬度(取第一列,若实际是每一行纬度一致则取lats[0, :]) lat_1d = lats[:, 0] # 提取1D经度(取第一行,若实际是每一列经度一致则取lons[:, 0]) lon_1d = lons[0, :] # 可选:确保数组有序(部分数据可能乱序) lat_1d = np.sort(lat_1d) lon_1d = np.sort(lon_1d)
2. 不规则网格场景
如果经纬度是不规则分布的,先展平2D数组,再去重排序得到1D维度:
# 展平2D数组并去重排序 lat_1d = np.sort(np.unique(lats.flatten())) lon_1d = np.sort(np.unique(lons.flatten()))
二、优化区域筛选代码
你当前的代码存在两个问题:
reallat = lats是引用赋值,修改reallat会直接改变原lats数组,应该用copy()创建副本- 用
nan标记再找索引的方式冗余,直接用布尔掩码更高效
优化后的区域筛选代码:
import numpy as np # 定义目标区域范围 lat_min, lat_max = 24, 31 lon_min, lon_max = -92, -84 # 创建布尔掩码:同时满足经纬度条件的所有位置 region_mask = (lats >= lat_min) & (lats <= lat_max) & (lons >= lon_min) & (lons <= lon_max) # 提取符合条件的温度数据(自动展平为1D) selected_temps = tdisk[:, region_mask] # 计算平均值 avg_temp = np.mean(selected_temps) print("Average Temps in Selected Region:", avg_temp)
三、新手友好工具:xarray库
处理NetCDF数据推荐使用xarray,它能自动管理维度,无需手动处理数组形状,大幅简化操作:
import xarray as xr # 读取GOLD卫星NetCDF文件 ds = xr.open_dataset("your_gold_data.nc") # 若经纬度是2D,转换为1D规则维度(假设规则网格) ds = ds.assign_coords( latitude=("latitude", np.unique(ds.latitude[:, 0])), longitude=("longitude", np.unique(ds.longitude[0, :])) ) # 直接按经纬度范围筛选区域 selected_ds = ds.sel( latitude=slice(lat_min, lat_max), longitude=slice(lon_min, lon_max) ) # 计算平均温度 avg_temp = selected_ds.tdisk.mean().values print("Average Temps in Selected Region:", avg_temp)
内容的提问来源于stack exchange,提问作者Merlot Ponti
相关产品推荐
相关产品推荐

