如何在不覆盖整个内容的情况下DataArray
向现有内容添加新内容?Dataset
新DataArray
的与现有的共享一些坐标,但也有新的坐标。在我当前的实现中,Dataset
被完全覆盖,而不是仅仅添加新的东西。
现有的DataArray
是一个分块的 zarr 支持DirectoryStore
(尽管我对 S3 商店有同样的问题)。
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
?
谢谢!