- 积分
- 14
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2024-4-10
- 最后登录
- 1970-1-1
|
发表于 2025-4-15 09:05:59
|
显示全部楼层
参考楼主的代码,三维的我这么处理:
def AreaWeightMean_3D(data3D, lat, lon):
'''
data3D: 要进行区域加权平均的变量 3D: [time, lat, lon]
lat: data3D对应的纬度 1D
lon: data3D对应的经度 1D
'''
jlat = lat.shape[0]
rad = 4.0 * np.arctan(1.0) / 180.0
re = 6371220.0
rr = re * rad
# 经度间隔,因为是均匀分布,可以直接使用第一个间隔作为所有间隔
dlon = np.abs(lon[2] - lon[1]) * rr
dx = dlon * np.cos(lat * rad)
# 纬度间隔不均匀,需要单独计算每个点的间隔
dy = np.zeros(jlat)
dy[0] = np.abs(lat[2] - lat[1]) * rr
dy[1: jlat - 1] = np.abs(lat[2: jlat].values-lat[0: jlat - 2].values)*rr * 0.5
dy[jlat - 1] = abs(lat[jlat - 1] - lat[jlat - 2]) * rr
area = dx * dy
# 扩展 area 维度以匹配 data3D
area_3D = np.expand_dims(area, axis=(0, 2))
# 处理缺失值
valid_mask = ~np.isnan(data3D)
data3D = np.nan_to_num(data3D)
# 计算加权和
sumtop = np.sum(data3D * area_3D * valid_mask, axis=(1, 2))
sumbottom = np.sum(area_3D * valid_mask, axis=(1, 2))
dataAreaWeightMean = sumtop / sumbottom
return dataAreaWeightMean |
|