将 numpy 数组或 xarray 数组传递给函数的装饰器
decorators to pass numpy arrays or xarray arrays to functions
您是否有任何方便装饰器的示例,这些装饰器可能允许采用类似 numpy 的数组的函数传入 xarray DataArrays 并确保维护元数据?
简而言之,我想将 numpy 数组或 xarrays 传递给我的函数,而不向保留元数据的函数定义添加逻辑。
我可以在 OSS 中指出的两个简单示例是 scikit-image 中的 rgb2gray
和 img_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
您是否有任何方便装饰器的示例,这些装饰器可能允许采用类似 numpy 的数组的函数传入 xarray DataArrays 并确保维护元数据?
简而言之,我想将 numpy 数组或 xarrays 传递给我的函数,而不向保留元数据的函数定义添加逻辑。
我可以在 OSS 中指出的两个简单示例是 scikit-image 中的 rgb2gray
和 img_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