在 hdf5 数据集中设置浮点精度

Setting float precision in hdf5 dataset

我很惊讶我找不到这个问题的答案。我正在将浮点值写入 hdf5 数据集,我想将精度设置为 10 位小数。从 hdf5 数据集上的 documentation 来看,似乎没有任何方法可以设置精度。我得到的最接近的是 'float32' 或 'float64',但 'float32' 切断了我的数字。文件大小对我来说是一个大问题,'float64' 中不必要的数字使文件大得多。是否可以使用 hdf5 选择精度?

我的问题示例: data[0] 的真实值为 0.0066896507

group.create_dataset(name, data=data, dtype='float64')

data[0] 产生 0.0066896506999999999,但是

group.create_dataset(name, data=data, dtype='float32')

给我 0.0066896505,这是不正确的。数据集中的其他数字更不正确。

这也很奇怪,因为当我这样做时

x = h5py.File(my_file,'r')
print(x['dataset'][0])

它给了我正确的号码。但是当我在控制台中输入 x['dataset'][0] 时,它给出了我上面写的内容。数据实际上是如何存储的?它真的给了那些额外的数字吗?如您所见,我对 hdf5 有点陌生(通常 python)。感谢您的帮助。

要创建自定义精度类型,您需要转到 h5py 的低级绑定,特别是 function/types 概述 http://api.h5py.org/h5t.html#atomic-classes. See https://github.com/h5py/h5py/blob/master/h5py/h5t.pyx#L202 以获取如何完成此操作的示例(对于 half/16-bit浮动)。

但是,这可能不是您想要的(考虑到对十进制数字的引用)。虽然存在基于 10 进制的浮点数(参见 https://en.wikipedia.org/wiki/Decimal64_floating-point_format), in practice if you're using python all floating point numbers are base-2. This means you care about the number of bits it's stored in (and what format, see https://en.wikipedia.org/wiki/IEEE_754#Basic_and_interchange_formats)。另外值得注意的是,完全有可能打印出比精度更多的数字(例如,我可以打印 float32,它存储 ~7 个有效数字和 30 个有效数字,但这并不意味着我有 30 个有效数字的精度)。因此,基于您关心至少 10 个有效数字的精度这一事实,您应该使用 float64(也称为 double、binary64)

如果您担心文件大小,值得关注一下 h5py 的压缩支持,请参阅 http://docs.h5py.org/en/latest/high/dataset.html#filter-pipeline