【问题标题】:Calculate xarray dataarray from coordinate labels从坐标标签计算 xarray 数据数组
【发布时间】:2021-06-23 11:00:15
【问题描述】:

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

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

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。 Cells/Rows/datasets 和 pandas(即使使用 Numba)似乎在这个数量上存在问题。在 xarray 上,我可以通过 Dask 在 32 个核心上处理它。

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

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

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

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

【问题讨论】:

  • 您能否提供一些示例数据或展示您的数据数组的外观?

标签: python pandas python-xarray


【解决方案1】:

这是应用函数的方式:

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:

矢量化:布尔值,可选 如果为 True,则假设 func 只接受在核心上定义的数组 尺寸作为输入并自动对其进行矢量化 :py:func:numpy.vectorize。这个选项是为了方便而存在的,但是 几乎总是比提供预矢量化函数慢。 使用此选项需要 NumPy 1.12 或更高版本。

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

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

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

【讨论】:

  • 谢谢,正是我想要的。工作速度极快。 DataSet 现在变得如此之大,我什至无法将它作为 pd DataFrame 过度处理,但那是另一个故事,我想我会尽可能长时间地坚持使用 xray。 P.S:也许为其他人编辑您的答案,因为df_vci 在我的示例中是 Pandas 数据框,而相应的 Xray 仅标识为 vci
【解决方案2】:

您可以在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
    )

【讨论】:

  • 导致TypeError: only size-1 arrays can be converted to Python scalars ...我必须先做reset_index()之类的事情吗?有没有可能直接访问坐标而不先重置索引?
  • @JürgenZornig 没有看到您的 xarray 看起来像什么我无法告诉您如何修复该错误 - 看起来它将函数应用于整个系列(列)而不是每个单独的值。
  • 我在上面添加了一些截图
  • 我非常感谢您为提供有用的提示所做的努力,不幸的是,这不起作用,我无法自己解决,而 @Val 的回答提供了一个工作代码示例和一个解释和有用的链接。我尽可能地支持您的答案,非常感谢您的帮助
  • @jürgenzornig 不用担心 - 是的,我忘了添加 vectorised=True arg。
猜你喜欢
  • 2020-07-06
  • 1970-01-01
  • 2019-07-07
  • 2018-12-24
  • 2020-04-27
  • 2020-07-09
  • 2019-11-12
  • 1970-01-01
  • 2016-06-08
相关资源
最近更新 更多