【问题标题】:Cleanest way to support xarray, dask, and numpy arrays in one function在一个函数中支持 xarray、dask 和 numpy 数组的最简洁方法
【发布时间】:2019-01-17 08:36:45
【问题描述】:

我有一个函数,它接受多个二维数组并创建两个具有相同形状的新数组。它最初被编写为仅支持 numpy 数组,但如果看到“块”属性,则被“破解”以支持 dask 数组。一位使用 xarray DataArrays 的用户指出,此函数现在返回 dask 数组,因为 DataArray 具有“块”属性。

我想知道 dask/xarray 专家是否可以告诉我支持所有 3(4 个?)对象类型的最简洁方法可能是无需为每种类型(numpy 数组、dask 数组、带有 numpy 的 xarray , xarray 与 dask)。请记住,输入是二维数组,因此不支持开箱即用的屏蔽操作。修复此问题的相关拉取请求是 here。这是我们目前在尝试避免添加 xarray 和 dask 作为所需依赖项时所做的:

if hasattr(az_, 'chunks') and not hasattr(az_, 'loc'):
    # dask array, but not xarray
    import dask.array as da
    az_ = da.where(top_s > 0, az_ + np.pi, az_)
    az_ = da.where(az_ < 0, az_ + 2 * np.pi, az_)
elif hasattr(az_, 'loc'):
    # xarray
    az_.data[top_s > 0] += np.pi
    az_.data[az_.data < 0] += 2 * np.pi
else:
    az_[top_s > 0] += np.pi
    az_[az_ < 0] += 2 * np.pi

编辑: 是否存在 xarray 对象的半唯一属性?

【问题讨论】:

  • 为什么要通过属性来区分?这有点危险,因为 numpy.array 的子类可能具有 chunks 属性。我认为isinstance(az_, dask.array.Array) 更直接。
  • 好的。您可能希望避免不必要的依赖。尝试:

标签: python numpy dask python-xarray


【解决方案1】:

好的。您可能希望避免不必要的依赖。 我经常定义has_dask变量

try:
    import dask.array as da
    has_dask = True
except ImportError:
    has_dask = False

然后

if has_dask and isinstance(az_, da.Array):
    --- do some thing ---
else
    --- do some other thing ----

【讨论】:

  • 这就是我最终的结果,谢谢。此外,我提取了所有 xarray 对象.data,以便可以将其视为普通的 dask/numpy 数组,然后将其放回 xarray 对象中。
【解决方案2】:

我在这里聚会有点晚了,但是如果您经常这样做,那么您可能会考虑使用函数装饰器,它将您的输入数组强制转换为 ndarray(或任何情况),运行包装的函数,甚至可能在返回之前重新包装结果以匹配输入类型。这是我玩过几次的东西,但我一直决定我宁愿能够在可能的情况下利用和支持 xarray 对象。当我第一次开始使用 xarray 时,我花了一些时间查看 xr-scipy。您可能会在其中找到一些足够通用的模式(或者可以很容易地做到这一点),同时在适当的时候为 xarray 对象添加一些额外的东西。

【讨论】:

    猜你喜欢
    • 2016-12-17
    • 1970-01-01
    • 2016-12-25
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多