h5py矩阵存储精度

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了h5py矩阵存储精度相关的知识,希望对你有一定的参考价值。

我想使用Python3-h5py将矩阵存储到.HDF5格式我的问题是,当我将初始数据与从HDF5文件中提取的数据进行比较时,我得到了惊人的差异。

import numpy
import h5py

# Create a vector of float64 values between 0 and 1
A = numpy.array(range(16384+1))/(16384+1)

# Save the corresponding float16 array to a HDF5 file
Fid = h5py.File("Output/Test.hdf5","w")
Group01 = Fid.create_group("Group")
Group01.create_dataset("Data", data=A, dtype='f2')
# Group01.create_dataset("Data", data=A.astype(numpy.float16), dtype='f2')# Use that line to avoid the bug
Fid.flush()
Fid.close()

# Read the HDF5 file
Fid = h5py.File("Output/Test.hdf5",'r')
B = Fid["Group/Data"][:]
Fid.close()

# Compare float64 and float16 Values
print(A[8192])
print(B[8192])
print("")
print(A[8192+1])
print(B[8192+1])
print("")
print(A[16384])
print(B[16384])

给:

0.499969484284
0.25

0.500030515716
0.5

0.999938968569
0.5

有时我得到的差异大约是“0.00003”,有时是“0.4999”。通常情况下,我应该总是得到“0.00003”,它与float16舍入有关,介于0和1之间。但是“0.4999”值确实是意料之外的,我注意到它发生在接近幂的值上。 2(例如“~1 / 2”将存储为“~1 / 4”)。

这是h5py包中的错误吗?

提前致谢,

斯特凡,

[Xubuntu 17.09 64bits + python3-h5py v2.7.1-2 + python3 v3.6.3-0ubuntu2]

答案

我不完全确定这可以被视为一个答案,但我终于以一个小小的规避摆脱了我的问题。

总结一下,看起来有一个“h5py v2.7.1-2”的错误

使用h5py存储数组时,请勿使用以下命令:

`Group01.create_dataset("Data", data=A, dtype='f2')# Buggy command`

但反而 :

`Group01.create_dataset("Data", data=A.astype(numpy.float16), dtype='f2')`

以上是关于h5py矩阵存储精度的主要内容,如果未能解决你的问题,请参考以下文章

使用 h5py 将光栅图像添加到 HDF5 文件

R如何为循环编写双精度并将结果存储在矩阵中

利用h5py存储数据

使用 H5Py 在 HDF5 中存储日期时间

H5py 存储字符串列表列表

如何将浮点矩阵作为 2D 纹理传递给片段着色器?