沿XArray的时间维度应用函数

时间:2019-08-19 07:58:31

标签: dask python-xarray

我在XArray DataArray中存储了一个尺寸为时间x,y,y的图像堆栈,我希望沿着每个像素的时间轴在其上应用自定义函数,以便输出为尺寸为x的单个图像, y。

我尝试了:apply_ufunc,但是函数失败,说明我需要先将数据加载到RAM中(即不能使用Dask数组)。理想情况下,我想在内部将DataArray保留为Dask Array,因为不可能将整个堆栈加载到RAM中。确切的错误消息是:

  

ValueError:apply_ufunc在参数上遇到了dask数组,但是尚未启用对dask数组的处理。设置dask参数或使用.load().compute()

首先将数据加载到内存中

我的代码当前如下所示:

import numpy as np
import xarray as xr
import pandas as pd 

def special_mean(x, drop_min=False):
    s = np.sum(x)
    n = len(x)
    if drop_min:
    s = s - x.min()
    n -= 1
    return s/n

times = pd.date_range('2019-01-01', '2019-01-10', name='time')

data = xr.DataArray(np.random.rand(10, 8, 8), dims=["time", "y", "x"], coords={'time': times})
data = data.chunk({'time':10, 'x':1, 'y':1})

res = xr.apply_ufunc(special_mean, data, input_core_dims=[["time"]], kwargs={'drop_min': True})

如果我确实使用.compute将数据加载到RAM中,那么我仍然会遇到以下错误:

  

ValueError:应用的函数返回的数据具有意外的维数:0与2,维数('y','x')

我不确定我到底缺少什么/做错了什么。

1 个答案:

答案 0 :(得分:2)

def special_mean(x, drop_min=False):
    s = np.sum(x)
    n = len(x)
    if drop_min:
        s = s - x.min()
    n -= 1
    return s/n

times = pd.date_range('2019-01-01', '2019-01-10', name='time')

data = xr.DataArray(np.random.rand(10, 8, 8), dims=["time", "y", "x"], coords={'time': times})
data = data.chunk({'time':10, 'x':1, 'y':1})

res = xr.apply_ufunc(special_mean, data, input_core_dims=[["time"]], kwargs={'drop_min': True}, dask = 'allowed', vectorize = True)

上面的代码应该可以工作。