python-3.x 矩阵存储的h5py精度

ttygqcqt  于 2022-11-19  发布在  Python
关注(0)|答案(1)|浏览(151)

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

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”,这与0和1之间的值的float 16舍入有关。但“0. 4999”值确实出乎意料,我注意到,它发生在接近2的幂的值上(例如,“~1/2”将存储为“~1/4”)。
是h5 py包的bug吗?
先谢谢你,
斯蒂芬,
[Xubuntu 17.09 64位+Python3-h5 py v2.7.1-2 +Python3 v3.6.3- 0 ubuntu 2]

3ks5zfa0

3ks5zfa01#

不是完全确定这可以被认为是一个答案,但我终于摆脱了我的问题与一个小规避。
总结一下,看起来“h5 py v2. 7. 1 -2”有一个bug
当使用h5 py存储数组时,不要使用这样的命令:

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

但取而代之的是:

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

2022年11月18日编辑:使用h5 py ==3.7.0,该错误现已修复

相关问题