在hdf5数据集

时间:2017-02-23 15:56:28

标签: python-2.7 precision hdf5 h5py

我很惊讶我无法找到这个问题的答案。我将浮点值写入hdf5数据集,我想将精度设置为10位小数。从hdf5数据集上的documentation开始,似乎没有任何设置精度的方法。我得到的最接近的是' float32'或者' float64',但是' float32'切断我的号码。文件大小对我来说是一个很大的问题,并且' float64'使文件显着增大。是否可以使用hdf5选择精度?

我的问题的一个例子: 数据[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)有点新鲜。谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

要创建自定义精度类型,您需要删除h5py的低级绑定,特别是概述http://api.h5py.org/h5t.html#atomic-classes的函数/类型。有关如何完成此操作的示例,请参阅https://github.com/h5py/h5py/blob/master/h5py/h5t.pyx#L202。(对于半/ 16位浮点数)。

然而,这可能不是你想要的(给出十进制数字的引用)。虽然存在基于10的浮点数(参见例如https://en.wikipedia.org/wiki/Decimal64_floating-point_format),但实际上如果您使用python,则所有浮点数都是base-2。这意味着您关心它所存储的位数(以及采用何种格式,请参阅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