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

标签 python pandas python-xarray

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

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

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 组成。单元格/行/数据集和 pandas(即使使用 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, optional If True, then assume func only takes arrays defined over core dimensions as input and vectorize it automatically with :py:func:numpy.vectorize. This option exists for convenience, but is almost always slower than supplying a pre-vectorized function. Using this option requires NumPy version 1.12 or newer.

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

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

更多信息可以在xarray tutorial on applying ufuncs中找到

关于python - 从坐标标签计算 xarray 数据数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66819923/

相关文章:

python - 将元组列表转换为结构化的 numpy 数组

python - Unicode解码错误: 'utf-8' codec can't decode byte 0xd5 in position 3362: invalid continuation byte

python - 来自 sk_learn 的 LogisticRegression 和来自 statsmodels.formula.api 的 smf.logit() 返回不同的结果

python - 根据 Pandas Dataframe 中另一列的内容在一列上运行操作

python - xarray - 使用 groupby 按一年中的每一天的气候每小时 netCDF 数据进行分组

Python:打开不带扩展名 ".zip"的zip文件

python - PIL 中的 PNG 图像质量

python - 如何使用正则表达式在 Pandas 数据框中获取字符串

python - 堆叠从 Xarray 生成的 Dask 数组的有效方法

python - 在 python xarray netcdf4 中创建输出变量并复制属性