numpy xarray数据集调整to_zarr()的维度坐标

uubf1zoe  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(100)

我有一个数据集,并希望将其附加到现有的zarr,我必须处理数据集中的一个维度,'range',与zarr中的大小不同。我希望用零或nan填充数据。

问题是

下面是当我尝试向我的zarr添加一些新数据时发生的情况:

>>> z = zarr.open('my.zarr', 'r+')
>>> ds = ... # created from other files
>>> ds
<xarray.Dataset>
Dimensions:            (range: 12571, time: 70)
Coordinates:
  * time               (ping_time) datetime64[ns] 2022-05-05T12:50:43.625000 ...
  * range              (range) float64 0.0 1.0 2.0 ... 1.267e+04 1.267e+04
  ...
Data variables:
    mydata             (time, range) float64 7.379...
    ...
>>> z.range.size
12669
>>> ds.to_zarr('my.zarr', append_dim='time') # Problem!!
...
ValueError: variable 'mydata' already exists with different dimension sizes: {'range': 12669} != {'range': 12571}. to_zarr() only supports changing dimension sizes when explicitly appending, but append_dim='time'

字符串
由此看来,如果我能改变“范围”维度,使现有的zarr:

>>> ds.range.size
12571
>>>


>>> ds.range.size
12669
>>>


如何更改数据集中现有维度的坐标大小?是否有其他方法将此数据附加到我的zarr?

我尝试过:

在查看了如何附加我的“范围”维度之后,我尝试通过创建一个新维度并来回重命名来分配新坐标,但似乎不起作用:

>>>ds = ds.rename({"range":"old_range"})
>>>ds = ds.expand_dims(dim={"range" : z.range.size})
>>>res = np.append(ds.old_range.data, z.range[ds.old_range.data.size : z.range.size])
>>>ds = ds.assign_coords({"range": res})
>>>ds
<xarray.Dataset>
Dimensions:            (range: 12669, time: 70,
                        old_range: 12571)
Coordinates:
  * time          (ping_time) datetime64[ns] 2022-05-05T12:50:43.625000 ...
  * old_range          (old_range) float64 0.0 0.007955 0.01591 ... 99.98 99.99
  * range              (range) float64 0.0 0.007955 0.01591 ... 99.98 99.99
Data variables:
    mydata                 (range, time, old_range) float64 7.379...


所以现在看来,“mydata”似乎有两个维度。似乎所有数据变量都增加了“范围”维度。我该如何解决/避免这个问题?
顺便说一下,对于revese的情况,其中ds.range.size > z.range.size似乎可以只执行z.range.resize(ds.range.size)

arknldoa

arknldoa1#

经过一番搜索,我发现了一些似乎有效的东西。xarray 'pad'函数可以像这样调整'range'维度的大小:

amountToPad = z.range.size - ds.range.size
ds = ds.pad(range=(0,amountToPad))
ds.to_zarr('my.zarr', append_dim='time')

字符串

相关问题