首页 > 解决方案 > 如何计算两个 N 维 xarray 的 Pearson 相关性?

问题描述

我有两个 netcdf 文件,作为 xarrays 导入(请参见下面的摘要图像),其中包含非洲的季节性降水数据(纬度、经度、季节、降水)(重新网格化到同一网格)。我想通过计算要在泰勒图中(每个季节)使用的皮尔逊相关系数(模式相关性)来比较每个季节。我试过 numpy's corrcoef,但这会返回一个矩阵,我需要一个值。我也尝试过 scipy pearsonsr,但它会引发错误(具有多个元素的数组的真值不明确。使用 a.any() 或 a.all())。我是 python 和 netcdf 文件的新手,因此不胜感激。

文件1:

<xarray.DataArray 'pre' (season: 4, lat: 162, lon: 162)>
array([[[       nan,        nan,        nan, ...,        nan,
                nan,        nan],
        [       nan,        nan,        nan, ...,        nan,
                nan,        nan],
        [       nan,        nan,        nan, ...,        nan,
                nan,        nan],
        ...,
        [       nan,        nan,        nan, ..., 21.462164 ,
         21.921623 , 20.583786 ],
        [       nan,        nan,        nan, ..., 22.240545 ,
         21.24054  , 21.135136 ],
        [       nan,        nan,        nan, ..., 20.78919  ,
         20.45946  , 18.62973  ]]], dtype=float32)
Coordinates:
  * lon   (lon) float64 -20.25 -19.75 -19.25 -18.75 ... 59.25 59.75 60.25
  * lat   (lat) float64 -40.25 -39.75 -39.25 -38.75 ... 39.25 39.75 40.25
  * season(season) object 'DJF' 'JJA' 'MAM' 'SON'

文件2:

<xarray.DataArray 'tp' (season: 4, lat: 162, lon: 162)>
array([[[        nan,         nan,         nan, ...,         nan,
                 nan,         nan],
        [        nan,         nan,         nan, ...,         nan,
                 nan,         nan],
        [        nan,         nan,         nan, ...,         nan,
                 nan,         nan],
        ...,
        [        nan,         nan,         nan, ..., 21.7096725 ,
         21.09724263, 19.69123712],
        [        nan,         nan,         nan, ..., 21.2375123 ,
         20.71120389, 20.73519617],
        [        nan,         nan,         nan, ..., 20.80748653,
         19.70237051, 18.9941896 ]]])
Coordinates:
  * lon   (lon) float64 -20.25 -19.75 -19.25 -18.75 ... 59.25 59.75 60.25
  * lat   (lat) float64 -40.25 -39.75 -39.25 -38.75 ... 39.25 39.75 40.25
  * season(season) object 'DJF' 'JJA' 'MAM' 'SON'

标签: pythonnetcdfpython-xarraypearson-correlation

解决方案


如果您只是在一个数组和另一个数组之间的所有值中寻找单个相关系数,请尝试展平数组,然后从对角线上获取其中一个值(例如[0, 1])。:

>>> res = np. corrcoef(arr1.values.flat, arr2.values.flat)
>>> res
array([[1.       , 0.9985713],
       [0.9985713, 1.       ]])

>>> res[0, 1]
0.9985713

corrcoef总是返回一个数组,给出与数组的每个切片相关的相关性,但如果您正在寻找两者中所有元素的相关性,那么您需要将它们重塑为向量。


推荐阅读