Dask 将xarray与自定义函数一起使用并重新采样

Dask 将xarray与自定义函数一起使用并重新采样,dask,python-xarray,Dask,Python Xarray,我正在尝试获取一个数组并使用自定义函数对其重新采样。从本帖: 这是一个示例示例 我有一个数据集: <xarray.Dataset> Dimensions: (lat: 100, lon: 130, time: 7305) Coordinates: * lon (lon) float32 -99.375 -99.291664 -99.208336 ... -88.708336 -88.625 * lat (lat) float32 49.78038 49.

我正在尝试获取一个数组并使用自定义函数对其重新采样。从本帖:

这是一个示例示例

我有一个数据集:

<xarray.Dataset>
Dimensions:  (lat: 100, lon: 130, time: 7305)
Coordinates:
  * lon      (lon) float32 -99.375 -99.291664 -99.208336 ... -88.708336 -88.625
  * lat      (lat) float32 49.78038 49.696426 49.61247 ... 41.552795 41.46884
    lev      float32 1.0
  * time     (time) datetime64[ns] 2040-01-01 2040-01-02 ... 2059-12-31
Data variables:
    tmin     (time, lat, lon) float32 dask.array<chunksize=(366, 100, 130), meta=np.ndarray>
    tmax     (time, lat, lon) float32 dask.array<chunksize=(366, 100, 130), meta=np.ndarray>
    prec     (time, lat, lon) float32 dask.array<chunksize=(366, 100, 130), meta=np.ndarray>
    relh     (time, lat, lon) float32 dask.array<chunksize=(366, 100, 130), meta=np.ndarray>
    wspd     (time, lat, lon) float32 dask.array<chunksize=(366, 100, 130), meta=np.ndarray>
    rads     (time, lat, lon) float32 dask.array<chunksize=(366, 100, 130), meta=np.ndarray>
Attributes:
    history:  Fri Jun 14 10:32:22 2019: ncatted -a _FillValue,,o,d,9e+20 IBIS...
data.resample(time='1MS').map(special_mean)


<xarray.Dataset>
Dimensions:  (time: 240)
Coordinates:
  * time     (time) datetime64[ns] 2040-01-01 2040-02-01 ... 2059-12-01
    lev      float32 1.0
Data variables:
    tmin     (time) float32 dask.array<chunksize=(1,), meta=np.ndarray>
    tmax     (time) float32 dask.array<chunksize=(1,), meta=np.ndarray>
    prec     (time) float32 dask.array<chunksize=(1,), meta=np.ndarray>
    relh     (time) float32 dask.array<chunksize=(1,), meta=np.ndarray>
    wspd     (time) float32 dask.array<chunksize=(1,), meta=np.ndarray>
    rads     (time) float32 dask.array<chunksize=(1,), meta=np.ndarray>

我怀疑你可以用
apply\ufunc
方法做你想做的事情


(尽管作为免责声明,我并不熟悉Xarray API。)

这里有一个示例,说明如何使用
xr.apply\u ufunc()

将xarray作为xr导入
data=xr.tutorial.open\u数据集(“空气温度”)
def特殊平均值(x,下降最小值=假):
s=np.和(x)
n=len(x)
如果下降到最小值:
s=s-x.min()
n-=1
返回序列号
def特殊功能(数据):
返回xr.apply\u ufunc(特殊意思、数据、输入\u core\u dims=[[“时间”]],
kwargs={'drop_min':True},dask='allowed',vectorize=True)
数据。重采样(时间=1MS')。应用(特殊功能)
尺寸:(纬度:25,经度:53,时间:24)
协调:
*时间(时间)日期时间64[ns]2013-01-01 2013-02-01。。。2014-12-01
*lat(lat)浮动3275.072.570.067.565.0。。。25.0 22.5 20.0 17.5 15.0
*lon(lon)浮动32200.0202.5205.0207.5。。。322.5 325.0 327.5 330.0
数据变量:
空气(时间、纬度、经度)浮动64 244.6 244.7 244.7。。。297.7 297.7 297.7

怎么做?我试过使用ufunc,但我不确定我是否只是不知道它是如何工作的?它去哪里了?如文档所示,vectorize=True对于我的大小数据集来说非常慢。你知道我怎样才能让它快一点吗?还有,有没有办法把超出范围的变量传递给特殊的函数。用例将是drop_min only 1而不是drop_min两次或类似的情况。@blueduckyy尝试使用
.chunk()
将数据转换为dask数组,然后将参数切换为
dask='parallellelized'
:)这将允许ufunc使用dask对数据进行惰性操作,随后,您可以使用
da.compute()
将数据加载到内存中。看看我的另一个答案,看看是否有用。:)
data.resample(time='1MS').map(special_mean)


<xarray.Dataset>
Dimensions:  (time: 240)
Coordinates:
  * time     (time) datetime64[ns] 2040-01-01 2040-02-01 ... 2059-12-01
    lev      float32 1.0
Data variables:
    tmin     (time) float32 dask.array<chunksize=(1,), meta=np.ndarray>
    tmax     (time) float32 dask.array<chunksize=(1,), meta=np.ndarray>
    prec     (time) float32 dask.array<chunksize=(1,), meta=np.ndarray>
    relh     (time) float32 dask.array<chunksize=(1,), meta=np.ndarray>
    wspd     (time) float32 dask.array<chunksize=(1,), meta=np.ndarray>
    rads     (time) float32 dask.array<chunksize=(1,), meta=np.ndarray>
data.resample(time='1MS').mean()
import xarray as xr
data = xr.tutorial.open_dataset('air_temperature')

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

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

data.resample(time='1MS').apply(special_func)

<xarray.Dataset>
Dimensions:  (lat: 25, lon: 53, time: 24)
Coordinates:
  * time     (time) datetime64[ns] 2013-01-01 2013-02-01 ... 2014-12-01
  * lat      (lat) float32 75.0 72.5 70.0 67.5 65.0 ... 25.0 22.5 20.0 17.5 15.0
  * lon      (lon) float32 200.0 202.5 205.0 207.5 ... 322.5 325.0 327.5 330.0
Data variables:
    air      (time, lat, lon) float64 244.6 244.7 244.7 ... 297.7 297.7 297.7