如何计算两个N维xarray的皮尔逊相关系数以用于泰勒图绘制
解决方法
你遇到的问题根源来自函数对输入数据的维度要求不匹配,以下是两种可直接落地的实现方案:
方案1:使用xarray原生xr.corr函数(最简便,适配你的数据结构)
xarray自带的相关计算函数会自动处理维度匹配、缺失值过滤,不需要手动循环或处理矩阵,直接按季节输出单个相关值:
import xarray as xr # 假设文件1导入后的DataArray名为da1,文件2导入后的DataArray名为da2 # 指定在lat、lon维度上计算相关,保留season维度,每个季节对应一个结果 season_corr = xr.corr(da1, da2, dim=["lat", "lon"])
得到的season_corr是长度为4的DataArray,对应四个季节的皮尔逊相关系数:
- 查看所有季节的相关值:直接执行
print(season_corr) - 提取单个季节的数值用于泰勒图绘制:比如
season_corr.sel(season='DJF').item()
方案2:基于scipy的pearsonr实现(手动循环适配维度)
如果你需要保留scipy的计算逻辑,需要手动拆分季节、过滤缺失值后再传入函数:
from scipy.stats import pearsonr import numpy as np corr_result = [] for season in da1.season: # 提取单个季节的降水数据,展平为1维数组 arr1 = da1.sel(season=season).values.flatten() arr2 = da2.sel(season=season).values.flatten() # 过滤掉两个数组中任意一方为缺失值的格点 valid_mask = ~np.isnan(arr1) & ~np.isnan(arr2) # 计算相关系数,pearsonr返回(相关值, 显著性p值),取第一个元素即可 r, p = pearsonr(arr1[valid_mask], arr2[valid_mask]) corr_result.append(r) # 转换为xarray格式方便后续调用,结果和方案1完全一致 season_corr = xr.DataArray(corr_result, coords={"season": da1.season}, dims=["season"])
问题原因说明
- numpy的
corrcoef返回的是两两相关矩阵,传入两个1维数组时,矩阵的[0,1]或[1,0]位置才是需要的相关值,需要手动提取,且需要额外处理缺失值和维度循环。 - scipy的
pearsonr仅支持1维数组作为输入,直接传入3维的xarray对象时,函数内部逻辑判断无法处理多维数组,就会抛出歧义报错。
内容的提问来源于stack exchange,提问作者Jessica
相关产品推荐
相关产品推荐

