我在生成具有维度('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()
这是气象学家和遥感研究的重要资产。它允许评估给定研究领域的潜在地球物理模式。
感谢您抽出宝贵时间,我希望尽快收到您的来信。
您忠诚的,