如何统计多个xarray.DataArray中符号一致的网格点数量?
问题描述
我有三个xarray.DataArray(ds1、ds2、ds3),每个都存储了非洲区域网格点的相关系数值,数据结构示例如下:
<xarray.DataArray (lat: 80, lon: 80)> array([[ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], ..., [ nan, nan, nan, ..., 0.35216908, 0.35083426, 0.34060067], [ nan, nan, nan, ..., 0.26451613, 0.33259177, 0.30723026], [ nan, nan, nan, ..., 0.29477197, 0.26674082, 0.25828699]]) Coordinates: * lon (lon) float64 -19.5 -18.5 -17.5 -16.5 -15.5 ... 56.5 57.5 58.5 59.5 * lat (lat) float64 -39.5 -38.5 -37.5 -36.5 -35.5 ... 36.5 37.5 38.5 39.5
三个数组的维度、坐标完全一致,仅网格点的相关系数值不同。对应的网格点相关系数分布图显示了非洲区域不同位置的相关系数空间分布。
现需针对每个网格点,统计正/负相关的DataArray数量(即正/负相关的模型个数),并绘制跨模型的符号一致性分布图。
实现步骤
1. 合并多数组到统一数据集
先将三个DataArray合并为一个带model维度的Dataset,方便批量处理所有模型的数据:
import xarray as xr # 合并三个DataArray,新增model维度存储不同模型 combined_ds = xr.Dataset({ 'model1': ds1, 'model2': ds2, 'model3': ds3 }).to_array(dim='model')
2. 统计正/负相关的模型数量
针对每个网格点,分别计算正相关(值>0)和负相关(值<0)的模型个数,自动忽略NaN值:
# 统计每个网格点正相关的模型数量 positive_count = (combined_ds > 0).sum(dim='model') # 统计每个网格点负相关的模型数量 negative_count = (combined_ds < 0).sum(dim='model')
注:布尔值在求和时会被转换为1(True)和0(False),NaN对应的布尔值为False,不会计入统计结果。
3. 绘制符号一致性分布图
使用matplotlib配合cartopy绘制非洲区域的空间分布图,示例代码如下:
import matplotlib.pyplot as plt import cartopy.crs as ccrs import cartopy.feature as cfeature # 创建双图布局,采用PlateCarree投影 fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16, 8), subplot_kw={'projection': ccrs.PlateCarree()}) # 绘制正相关模型数量分布图 positive_count.plot( ax=ax1, transform=ccrs.PlateCarree(), cmap='YlGnBu', cbar_kwargs={'label': '正相关模型个数'} ) ax1.add_feature(cfeature.COASTLINE, linewidth=0.8) ax1.add_feature(cfeature.BORDERS, linestyle=':', linewidth=0.5) ax1.set_title('跨模型正相关一致性分布') # 绘制负相关模型数量分布图 negative_count.plot( ax=ax2, transform=ccrs.PlateCarree(), cmap='RdPu', cbar_kwargs={'label': '负相关模型个数'} ) ax2.add_feature(cfeature.COASTLINE, linewidth=0.8) ax2.add_feature(cfeature.BORDERS, linestyle=':', linewidth=0.5) ax2.set_title('跨模型负相关一致性分布') plt.tight_layout() plt.show()
补充:计算一致性比例
若需要查看正/负相关模型占总有效模型的比例,可先统计每个网格点的有效模型数量(排除NaN):
# 统计每个网格点的有效模型数(非NaN值的数量) valid_count = combined_ds.notnull().sum(dim='model') # 计算正相关模型占比 positive_ratio = positive_count / valid_count # 计算负相关模型占比 negative_ratio = negative_count / valid_count
对比例值进行可视化,能更直观反映模型间的符号一致性程度。
内容的提问来源于stack exchange,提问作者Jessica
相关产品推荐
相关产品推荐

