Python 3.x 如何将皮尔逊相关分析作为相关矩阵应用于数据阵列的所有像素对?

Python 3.x 如何将皮尔逊相关分析作为相关矩阵应用于数据阵列的所有像素对?,python-3.x,numpy,python-xarray,numpy-ufunc,Python 3.x,Numpy,Python Xarray,Numpy Ufunc,在生成单个Netcdf的相关矩阵(逐像素)时,我面临着严重的困难,该矩阵的维数为(“lon”、“lat”、“time”)。我的最终目的是生成所谓的远程连接图 该图由相关系数组成。每个像素都有一个值,该值表示在DataArray中所有像素对的相关矩阵中找到的最高相关值(在模块中) 因此,为了创建我的远程连接图,我没有在每个经度('lon')和每个纬度('lat')上循环,然后检查所有可能的相关组合,其中一个在数量级上更高,我考虑使用xr.apply__ff函数,并在其中使用一个包装的相关函数 尽管

在生成单个Netcdf的相关矩阵(逐像素)时,我面临着严重的困难,该矩阵的维数为(“lon”、“lat”、“time”)。我的最终目的是生成所谓的远程连接图

该图由相关系数组成。每个像素都有一个值,该值表示在DataArray中所有像素对的相关矩阵中找到的最高相关值(在模块中)

因此,为了创建我的远程连接图,我没有在每个经度('lon')和每个纬度('lat')上循环,然后检查所有可能的相关组合,其中一个在数量级上更高,我考虑使用xr.apply__ff函数,并在其中使用一个包装的相关函数

尽管我付出了努力,但我仍然无法理解xr.apply_ufunc中幕后真正发生的事情。我所能做的就是把所有像素都等于1(完美相关性)作为一个单一的合成矩阵

见下面的代码:


这是气象学家和遥感研究的重要资产。它允许对给定研究区域的潜在地球物理模式进行评估

谢谢你抽出时间,我希望很快能收到你的来信


您诚挚的,

首先,您需要使用
np.corrcoef(x,y)[0,1]
。最后,您根本不需要使用
partial
,如下所示:

def相关性(x1,x2):
返回np.corrcoef(x1,x2)[0,1]#以返回单个相关指数,而不是矩阵
def_相关性(da,x,coord='time'):
“”“沿数据数组的给定维度查找相关性。”“”
返回xr.apply_ufunc(相关性,
爸爸,
x,,
输入\u核心\u dims=[[coord],[coord]],
输出\u核心\u dims=[[]],
矢量化=真,
输出类型=[float]
)

我已经设法解决了我的问题。剧本有点长了。尽管如此,它还是实现了先前的意图

代码是根据这一点改编的

由于在这里显示代码片段太长,我将发布一个指向我的Github帐户的链接,在其中可以检查算法(在名为Teleconnection_的包中使用_xarray_数据组织)

该软件包有两个具有类似结果的模块

第一个模块(带连接路径的远程连接)比第二个模块(通过连接路径的远程连接)慢,但它允许评估部分远程连接图之间的连接路径

第二种方法只返回生成的遥相关贴图,不返回连接线(geopandas线串),尽管速度要快得多

你可以自由交谈。如果可能的话,我想将这两个模块结合起来,确保远程连接算法中的速度和路径分析

诚挚的

菲利普·利尔

import numpy as np

import xarray as xr

def correlation(x, y):

    return np.corrcoef(x, y)[0,0] # to return a single correlation index, instead of a matriz


def wrapped_correlation(da, x, coord='time'):
    """Finds the correlation along a given dimension of a dataarray."""


    from functools import partial

    fpartial = partial(correlation, x.values)

    return xr.apply_ufunc(fpartial, 
                          da, 
                          input_core_dims=[[coord]] , 
                          output_core_dims=[[]],
                          vectorize=True,
                          output_dtypes=[float]
                          )



# testing the wrapped correlation for a sample data:

ds = xr.tutorial.open_dataset('air_temperature').load()

# testing for a single point in space.

x = ds['air'].sel(dict(lon=1, lat=92), method='nearest')

# over all points in the DataArray

Corr_over_x = wrapped_correlation(ds['air'], x)

Corr_over_x# notice that the resultant DataArray is composed solely of ones (perfect correlation match). This is impossible. I would expect to have different values of correlation for each pixel in here

# if one would plot the data, I would be composed of a variety of correlation values (see example below):

Corr_over_x.plot()