将 numpy 数组或 xarray 数组传递给函数的装饰器

decorators to pass numpy arrays or xarray arrays to functions

您是否有任何方便装饰器的示例,这些装饰器可能允许采用类似 numpy 的数组的函数传入 xarray DataArrays 并确保维护元数据?

简而言之,我想将 numpy 数组或 xarrays 传递给我的函数,而不向保留元数据的函数定义添加逻辑。

我可以在 OSS 中指出的两个简单示例是 scikit-image 中的 rgb2grayimg_as_* 等函数。 img_as_* 特别简单,因为唯一改变的是数据类型(和单位)

  import xarray as xr
  import numpy as np
  c = np.zeros([3, 3, 3])
  c_xr = xr.DataArray(c, dims=['y', 'x', 'rgb'])
  from skimage import img_as_ubyte
  print(img_as_ubyte(c_xr))  # this is a numpy array

如果这些装饰器存在于库中,你能指点我吗?如果您有用于自己项目的示例实现,您介意向我指出吗?

在大多数情况下,您可以制作一个只调用 xarray.apply_ufunc() 的装饰器。这使您可以重用 xarray 内部使用的相同包装代码。

例如:

import functools
import xarray as xr
import numpy as np
from skimage import img_as_ubyte

def enable_xarray_wrapper(func):
    """Adds an xarray wrapper for a function without core dimensions."""
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        return xr.apply_ufunc(func, *args, kwargs=kwargs)
    return wrapper

@enable_xarray_wrapper
def xarray_safe_img_as_ubyte(array):
    return img_as_ubyte(array)

c = np.zeros([3, 3, 3])
c_xr = xr.DataArray(c, dims=['y', 'x', 'rgb'])

print(xarray_safe_img_as_ubyte(c))  # this is a numpy.ndarray
print(xarray_safe_img_as_ubyte(c_xr))  # this is an xarray.DataArray
print(xarray_safe_img_as_ubyte(xr.Dataset({'foo': c_xr})))  # this is an xarray.Dataset