【问题标题】:Setting float precision in hdf5 dataset在 hdf5 数据集中设置浮点精度
【发布时间】:2017-07-14 05:10:29
【问题描述】:

我很惊讶我无法找到这个问题的答案。我正在将浮点值写入 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)有点陌生。感谢您的帮助。

【问题讨论】:

  • float32float64 是大多数编译器中的标准浮点类型(floatdoublec 编译器中)。每个数字使用 4 和 8 个字节。处理器和编译器旨在有效地处理这些大小。尝试使用 6 个字节(或更糟的是 5 或 7 个字节)会显着降低效率,而不会大幅减少内存使用量。
  • 如果我将此 hdf5 文件发送给其他人,他们会看到数字为 10 精度或更高吗?
  • 这可能是打印精度问题而不是存储问题。
  • 这很有可能。我想这不是问题,谢谢!

标签: python-2.7 precision hdf5 h5py


【解决方案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,所有浮点数都是以 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

【讨论】:

  • 谢谢。我相信这是一个打印问题,属于您的“打印的数字多于您的精度”的声明。
猜你喜欢
  • 1970-01-01
  • 2012-06-23
  • 1970-01-01
  • 2010-12-22
  • 2014-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多