微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决从坐标标签计算 xarray 数据数组

我有一个带有两个变量(气象数据)随时间变化的 DataArray,y,x 坐标。 x 和 y 坐标在投影坐标系 (epsg:3035) 中并对齐,以便每个单元格几乎完全覆盖 1km LAEA reference grid

的标准单元格

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

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

但就我所见,似乎不可能以某种方式将此函数应用于 DataArray 或 DataSet,以便我可以访问这些坐标变量(至少 .apply_ufunc() 并不是真的为我工作。

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

如果您就如何使这项工作获得任何建议,我将不胜感激。

编辑:关于我正在处理的数据的更多见解:

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

Xarray "vci" with monthly Vegetation Condition Indices over some decades

如果数据集足够小,我可以将其导出为 Pandas 数据帧并在那里进行计算,但由于内核经常崩溃,所以速度很慢而且不是很健壮

same calc in pandas

解决方法

您可以这样应用您的函数:

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

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

vectorize : bool,可选 如果为 True,则假设 func 仅采用在核心上定义的数组 维度作为输入并自动矢量化 :py:func:numpy.vectorize。存在此选项是为了方便,但 几乎总是比提供预先矢量化的函数慢。 使用此选项需要 NumPy 1.12 或更高版本。

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

如果没有,您可以考虑创建一个矢量化函数,例如numba 肯定会加快速度。

可以在xarray tutorial on applying ufuncs

中找到更多信息 ,

您可以在 unvectorised way 中使用 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
    )

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。