微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

xarray:动态选择数组缩减函数

如何解决xarray:动态选择数组缩减函数

将数组归约函数(例如 xarray.DataArray.mean)包装到函数/方法中以允许动态选择归约函数的最佳方法是什么?

我提出的方法基本上是将一个函数传递给 xarray.DataArray.reduce

class AwesomeClass:
    def __init__(self,xarray_obj):
        self._obj = xarray_obj
        
    def _reduce_by_10(self,fun,dim):
        """Reduce by steps of 10 over dim"""
        
        obj = self._obj
        """
        bunch of stuff happening here to obj
        that's the same independent of the reduction
        function
        """
        for index in range(0,x[dim].size,10):
            region = {dim: slice(index,index+10)}
            yield obj.isel(region).reduce(fun,dim=dim)
    
    def mean(self,dim="time"):
        yield from self._reduce_by_10(np.mean,dim=dim)
    
    def sum(self,dim="time"):
        yield from self._reduce_by_10(np.sum,dim=dim)


# sample data if needed
arr = xr.DataArray(
    np.random.RandomState(0).randn(2,3),[("x",["a","b"]),("y",[10,20,30])]
)

编辑:

不是将缩减函数传递给 _reduce_by_10,我还可以将切片的 obj 返回给相应的方法,然后使用 { 的现有 .mean/.sum 函数{1}}:

xarray.DataArray

重新表述我的问题:

  • 使用 class AwesomeClass: def __init__(self,xarray_obj): self._obj = xarray_obj def _slice_by_10(self,index+10)} yield obj.isel(region) def mean(self,dim="time"): for obj in self._slice_by_10(dim): yield obj.mean(dim) def sum(self,dim="time"): for obj in self._slice_by_10(dim): yield obj.sum(dim) 是否等同于 obj.reduce(np.mean,dim)
  • 以上两者之间有更好的方法吗?我不确定“双 obj.mean(dim)”,我认为 yield 更好。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。