我想将一些指标(例如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有两个不同命名的时间维度(初始化时间和预测时间),我无法让它工作。