1

我在生成具有维度('lon'、'lat'、'time')的单个 Netcdf 的相关矩阵(逐个像素)时面临严重困难。我的最终意图是生成所谓的远程连接地图。

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

因此,为了创建我的远程连接图,而不是循环遍历每个经度('lon')和每个纬度('lat'),然后检查所有可能的相关组合,其中一个更高的幅度,我正在考虑申请xr.apply_ufunction 内部带有包装的相关函数。

尽管我做出了努力,但我仍然没有了解 xr.apply_ufunc 幕后真正发生的事情。我所做的只是作为一个单一的结果矩阵,所有像素都等于 1(完美相关)。

请参见下面的代码:


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()

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

感谢您抽出宝贵时间,我希望尽快收到您的来信。

您忠诚的,

4

2 回答 2

3

首先,您需要使用np.corrcoef(x, y)[0,1]. 最后,你根本不需要使用partial,见下文:

def correlation(x1, x2):

    return np.corrcoef(x1, x2)[0,1] # 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."""

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

于 2019-10-23T15:57:46.730 回答
0

我设法解决了我的问题。剧本有点长了。尽管如此,它还是完成了之前的预期。

代码改编自此参考

由于在这里显示片段太长,我发布了一个指向我的 Github 帐户的链接,其中可以在此处检查算法(组织在名为 Teleconnection_using_xarray_data 的包中) 。

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

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

第二个,只返回生成的远程连接图,没有连接线(geopandas-Linestrings),虽然它要快得多。

随意合作。如果可能的话,我想在 Teleconnection 算法中结合确保速度和路径分析的两个模块。

您忠诚的,

菲利普·里尔

于 2019-10-24T19:28:49.097 回答