基于经纬度掩蔽NetCDF变量得到1D数组无法绘图,需生成可用多维数组的技术求助
解决NetCDF数据掩蔽后维度匹配问题
你的问题出在用布尔索引提取元素时把二维数组扁平化了——fcdBT150gHz[merged_coord]会把所有符合条件的元素从二维结构里拉出来,变成一维数组,自然没法和原来的二维经纬度对应上。正确的做法是保留原始数组的二维形状,只掩蔽掉不符合地理范围的元素,这样就能和经纬度维度完全匹配了。
修正后的实现步骤
1. 创建统一的掩蔽掩码
先把经纬度的掩蔽逻辑合并成一个二维掩码,这个掩码的形状和你的温度数组、经纬度数组完全一致(都是(2495, 90)):
# 生成经纬度的掩蔽条件:不符合范围的标记为True lon_mask = (lonlar < 105) | (lonlar > 110) lat_mask = (latlar < 30) | (latlar > 35) # 合并掩码:只要经纬度任意一个不符合,就需要掩蔽该位置 combined_mask = lon_mask | lat_mask
2. 掩蔽温度数组(保留二维结构)
用numpy.ma.masked_where把温度数组中符合掩码条件的元素掩蔽掉,返回的数组会保留原始的二维结构,只是不符合条件的元素被标记为掩蔽值:
# 掩蔽温度数组 masked_fcdBT150 = ma.masked_where(combined_mask, fcdBT150gHz) # 同步掩蔽经纬度数组,方便后续绘图时维度匹配 masked_lats = ma.masked_where(combined_mask, latlar) masked_lons = ma.masked_where(combined_mask, lonlar)
3. 基于纬度绘图(匹配维度)
现在你可以根据需求选择合适的绘图方式:
- 如果是要绘制每个有效地理位置点的温度与纬度对应关系,可以把掩蔽后的数组展平(掩蔽元素会自动被忽略):
plt.scatter(masked_lats.flatten(), masked_fcdBT150.flatten(), s=1) plt.xlabel('Latitude') plt.ylabel('150GHz Brightness Temperature') plt.title('Temperature vs Latitude (Masked Region: 105-110E, 30-35N)') plt.show()
- 如果是要绘制纬度维度的平均温度曲线,可以先对每个纬度计算平均值(掩蔽值会自动被排除在计算外):
# 沿第一维(假设是经度/扫描维度)计算每个纬度的平均温度 lat_avg_temp = ma.mean(masked_fcdBT150, axis=0) # 获取有效纬度的唯一值 unique_valid_lats = np.unique(masked_lats[~masked_lats.mask]) plt.plot(unique_valid_lats, lat_avg_temp[:len(unique_valid_lats)]) plt.xlabel('Latitude') plt.ylabel('Average 150GHz Brightness Temperature') plt.show()
原方法得到一维数组的原因
merged_coord是一个二维布尔数组,当你用它直接索引温度数组时,numpy会把所有True位置的元素从二维结构中提取出来,忽略它们原本的位置信息,因此返回的是一维数组。而masked_where是在原数组的基础上标记掩蔽元素,完全保留原始的形状和维度,这样就能和经纬度数组实现一一对应。
内容的提问来源于stack exchange,提问作者updraftman
相关产品推荐
相关产品推荐

