Python 3.x 如何将皮尔逊相关分析作为相关矩阵应用于数据阵列的所有像素对?
在生成单个Netcdf的相关矩阵(逐像素)时,我面临着严重的困难,该矩阵的维数为(“lon”、“lat”、“time”)。我的最终目的是生成所谓的远程连接图 该图由相关系数组成。每个像素都有一个值,该值表示在DataArray中所有像素对的相关矩阵中找到的最高相关值(在模块中) 因此,为了创建我的远程连接图,我没有在每个经度('lon')和每个纬度('lat')上循环,然后检查所有可能的相关组合,其中一个在数量级上更高,我考虑使用xr.apply__ff函数,并在其中使用一个包装的相关函数 尽管我付出了努力,但我仍然无法理解xr.apply_ufunc中幕后真正发生的事情。我所能做的就是把所有像素都等于1(完美相关性)作为一个单一的合成矩阵 见下面的代码: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函数,并在其中使用一个包装的相关函数 尽管
这是气象学家和遥感研究的重要资产。它允许对给定研究区域的潜在地球物理模式进行评估 谢谢你抽出时间,我希望很快能收到你的来信
您诚挚的,首先,您需要使用
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()