繁体   English   中英

从坐标标签计算 xarray 数据数组

[英]Calculate xarray dataarray from coordinate labels

我有一个 DataArray,其中有两个变量(气象数据)随时间,y,x 坐标。 x 和 y 坐标位于投影坐标系 (EPSG:3035) 中并对齐,以便每个单元格几乎完全覆盖1 公里 LAEA 参考网格的标准单元格

我想准备数据以在 Pandas 和/或数据库表中进一步使用,所以我想添加 LAEA Gridcell Number/Label,可以通过以下(伪)function 直接从 x 和 y 计算

def func(cell):
    return r'1km{}{}'.format(int(cell['y']/1000), int(cell['x']/1000))      # e.g. 1kmN2782E4850

但据我所知,似乎不可能将这个 function 应用于 DataArray 或 DataSet 以便我可以访问这些坐标变量(至少.apply_ufunc()并没有真正为我工作。

稍后我可以在 Pandas 上计算这个,但我的一些数据集包含 60 到 120 个 Mio。 单元格/行/数据集和 pandas(即使使用 Numba)似乎在这个数量上存在问题。 在 xarray 上,我可以通过 Dask 在 32 个核心上处理它。

我将不胜感激有关如何使其工作的任何建议。

编辑:对我正在使用的数据的更多见解:

这是最大的一个,有 500 个 Mio 单元,但我可以将其下采样到平方公里分辨率,最终得到大约 160 个 Mio。 细胞

Xarray "vci" 具有几十年的每月植被状况指数

如果数据集足够小,我可以将其导出为 pandas dataframe 并在那里计算,但这很慢而且不是很健壮,因为 kernel 经常崩溃

熊猫中的相同计算

这是您可以应用 function 的方法:

import xarray as xr

# ufunc
def func(x, y):
    #print(y)
     return r'1km{}{}'.format(int(y), int(x))

# test data
ds = xr.tutorial.load_dataset("rasm")

xr.apply_ufunc(
    func, 
    ds.x,
    ds.y,
    vectorize=True,
)

请注意,您不必在您的情况下列出input_core_dims

此外,由于您的 function 未矢量化,因此您需要设置vectorized=True

vectorize: bool, optional 如果为真,则假设func仅将在核心维度上定义的 arrays 作为输入,并使用:py:func: numpy.vectorize自动对其进行矢量化。 存在此选项是为了方便,但几乎总是比提供预矢量化的 function 慢。 使用此选项需要 NumPy 版本 1.12 或更高版本。

使用vectorized可能不是性能最高的选项,因为它本质上只是循环,但如果您将数据分块并使用dask ,它可能就足够了。

如果没有,您可以考虑使用例如 numba 创建一个矢量化的 function,这肯定会加快速度。

更多信息可以在关于应用 ufuncs 的 xarray 教程中找到

您可以以非矢量化方式使用apply_ufunc

def func(x, y):
    return f'1km{int(y/1000)}{int(x/1000)}'  # e.g. 1kmN2782E4850

xr.apply_ufunc(
    func, # first the function
    x.x,  # now arguments in the order expected by 'func'
    x.y
    )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM