我在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')
我不确定我到底缺少什么/做错了什么。
答案 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)
上面的代码应该可以工作。