重新索引/整形Dask DataArray

时间:2018-03-09 21:22:54

标签: dask python-xarray

我想将一些指标(例如RMSE)应用于具有不同预测/初始化时间的模型集合(参见下面的示例)。

ds_mod = <xarray.DataArray (ensemble: 12, init_time: 120, fore_time_i: 12, nj: 304,     ni: 448)>
dask.array<shape=(12, 120, 12, 304, 448), dtype=float64, chunksize=(12, 12, 12, 304, 448)>
Coordinates:
    lon          (nj, ni) float64 168.3 168.4 168.5 168.7 168.8 168.9 169.0 ...
    lat          (nj, ni) float64 31.1 31.25 31.4 31.55 31.69 31.84 31.99 ...
  * ensemble     (ensemble) int64 1 2 3 4 5 6 7 8 9 10 11 12
  * fore_time_i  (fore_time_i) int64 0 1 2 3 4 5 6 7 8 9 10 11
  * init_time    (init_time) datetime64[ns] 2000-01-01 2000-02-01 2000-03-01 ...
    fore_time    (init_time, fore_time_i) datetime64[ns] dask.array<shape=(120, 12), chunksize=(12, 12)>

没有坐标的尺寸:nj,ni

我的问题是我有这样的暗示观察:

ds_obs = <xarray.DataArray 'sic' (time: 131, nj: 304, ni: 448)>
dask.array<shape=(131, 304, 448), dtype=float64, chunksize=(1, 304, 448)>
Coordinates:
  * time     (time) datetime64[ns] 2000-01-01 2000-02-01 2000-03-01 ...
Dimensions without coordinates: nj, ni

我的想法是将观察结果重新格式化为像这样的模型(类似蛮力方法):

def format_obs_like_model(ds_mod, ds_obs):
    ''' Reformats observational dataset to be structured like a model forecast dataset 
    Format obs like model (i.e. ensemble x init_time x forecast_time) '''

    ds_obs_X = (ds_mod.copy() * np.nan).load() # Have to call load here to assign ie below
    for (i, e) in enumerate(ds_obs_X.ensemble):
        for (j, it) in enumerate(ds_obs_X.init_time):
            ds_obs_X[i, j, :] = ds_obs.sel(time=ds_mod.fore_time.sel(init_time=it))
    return ds_obs_X

如果数据在系统内存中但在外部失败,则此方法有效,因为我明确地加载()以允许分配。

有没有更好的方法来重新格式化? (这将适用于OOM数据)

我最初尝试reindex_like()

ds_obs_X = ds_obs.reindex_like(ds_mod)

但是因为ds_mod有两个不同命名的时间维度(初始化时间和预测时间),我无法让它工作。

0 个答案:

没有答案