0

假设我创建了一个带有整数变量的数据集。

import xarray as xr
import numpy as np

int_var = np.random.randint(0, 10, 10)
ds = xr.Dataset(data_vars={"int_var": (("x"), int_var)},
                 coords={"x": range(10)})

然后我保存它,提供一个编码和一个整数填充值:

from numcodecs import Blosc

compressor = Blosc(cname = 'lz4')
encoding = {v: {'compressor': compressor, 'dtype': ds[v].dtype, "_FillValue": -9999}
   for v in ds.data_vars}
ds.to_zarr(store="example.zarr", mode='w', consolidated=True, encoding=encoding)

然后当我读取数据时,类型已从 int32 更改为 float64。但是,该类型仍设置为<i8.zmetadata 文件中的类型,并且我看到该_FillValue类型已正确加载为 int。

# Loads int_var with dtype float64
reloaded = xr.open_zarr("example.zarr", consolidated=True)

我需要它是整数类型,因为我正在存储索引并且我的工作是使数据易于使用——用户每次需要时都必须更改每个整数列的 dtype 是不可接受的。

我注意到,如果我只是_FillValue从编码字典中删除,则类型会保持不变。发生了什么事,我该如何解决?

4

1 回答 1

0

默认情况下,xarray 尝试_FillValue用 NaN 替换字段。_FillValueNaN 是一个浮点值,因此如果 a存在,则 xarray 继续并将整个数组转换为浮点数。

xarray.open_dataset 也会发生这种情况,而不仅仅是 xarray.open_zarr。

解决方案是通过 mask_and_scale=False。

# Loads int_var with dtype int32 as desired
reloaded = xr.open_zarr("example.zarr", consolidated=True, mask_and_scale=False)
于 2021-07-20T19:42:57.757 回答