Добавление нового Xarray DataArray в существующее хранилище Zarr без перезаписи всего набора данных? - PullRequest
0 голосов
/ 21 сентября 2019

Как добавить новый DataArray к существующему Dataset, не перезаписывая все это?Новый DataArray разделяет некоторые координаты с существующими, но также имеет новые.В моей текущей реализации Dataset полностью перезаписывается, а не просто добавляется новый материал.

Существующий DataArray представляет собой чанкованный zarr DirectoryStore (хотя у меня та же проблема дляS3 store).

import numpy as np
import xarray as xr
import zarr

arr1 = xr.DataArray(np.random.randn(2, 3),
                   [('x', ['a', 'b']), ('y', [10, 20, 30])],
                   name='arr1')

ds = arr1.chunk({'x': 1, 'y': 3}).to_dataset()

ds выглядит так:

<xarray.Dataset>
Dimensions:  (x: 2, y: 3)
Coordinates:
  * x        (x) <U1 'a' 'b'
  * y        (y) int64 10 20 30
Data variables:
    arr1     (x, y) float64 dask.array<shape=(2, 3), chunksize=(1, 3)>

Я записываю его в каталог:

store = zarr.DirectoryStore('test.zarr')
z = ds.to_zarr(store, group='arr', mode='w')

Выглядит хорошо:

$ ls -l test.zarr/arr
total 0
drwxr-xr-x  6 myuser  mygroup  204 Sep 21 11:03 arr1
drwxr-xr-x  5 myuser  mygroup  170 Sep 21 11:03 x
drwxr-xr-x  5 myuser  mygroup  170 Sep 21 11:03 y

Я создаю новый DataArray, который разделяет некоторые координаты с существующим, и добавляю его к существующему Dataset.Сначала я прочитаю существующий Dataset, поскольку именно этим я и занимаюсь на практике.

ds2 = xr.open_zarr(store, group='arr')
arr2 = xr.DataArray(np.random.randn(2, 3),
                   [('x', arr1.x), ('z', [1, 2, 3])],
                   name='arr2')
ds2['arr2'] = arr2

Обновленный Dataset выглядит хорошо:

<xarray.Dataset>
Dimensions:  (x: 2, y: 3, z: 3)
Coordinates:
  * x        (x) <U1 'a' 'b'
  * y        (y) int64 10 20 30
  * z        (z) int64 1 2 3
Data variables:
    arr1     (x, y) float64 dask.array<shape=(2, 3), chunksize=(1, 3)>
    arr2     (x, z) float64 0.4728 1.118 0.7275 0.4971 -0.3398 -0.3846

...но я не могу написать в него без полной перезаписи.

# I think I'm "appending" to the group `arr`
z2 = ds2.to_zarr(store, group='arr', mode='a')

Это дает мне ValueError: The only supported options for mode are 'w' and 'w-'.

# I think I'm "creating" the new arr2 array in the arr group
z2 = ds2.to_zarr(store, group='arr', mode='w-')

Это дает мне ValueError: path 'arr' contains a group.

Единственное, что сработало, это z2 = ds2.to_zarr(store, group='arr', mode='w'), но этополностью перезаписывает группу.

Оригинальный DataArray на самом деле довольно большой в моей проблеме, поэтому я действительно не хочу переписывать его. Есть ли способ написать только новый DataArray?

Спасибо!

...