我有一个函数,可以接受多个2D数组并创建两个具有相同形状的新数组。它最初被编写为仅支持numpy数组,但是如果看到“块”属性,则会被“黑客”为支持dask数组。使用xarray DataArrays的用户指出,此函数现在返回dask数组,因为DataArray具有“ chunks”属性。
我想知道dask / xarray专家是否可以告诉我支持所有3(4?)个对象类型的最简洁方法,而不必为每种类型(numpy数组,dask数组,xarray和numpy)重复代码,带有dask的xarray)。请记住,输入是2D数组,因此开箱即用的掩膜操作不受支持。解决此问题的相关拉取请求为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对象半唯一的属性?
答案 0 :(得分:0)
好。您可能要避免不必要的依赖性。
我经常定义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 ----
答案 1 :(得分:0)
我在这里参加聚会有点晚了,但是如果您正在做很多事情,那么您可以考虑使用一个函数装饰器,该装饰器将把您的输入数组强制转换为ndarray(或任何情况),运行包装的函数,甚至在返回之前重新包装结果以匹配输入类型。我已经玩了好几次了,但是我一直在决定,我希望尽可能地利用和支持xarray对象。第一次开始使用xarray时,我花了一些时间看xr-scipy。您可能会在其中找到一些足够通用的模式(或者很容易做到),同时在适当的时候为xarray对象添加一些额外的东西。