h5py存储矩阵时所有元素变为0的问题求助
h5py写入数据集后元素全部变为0的问题解决
问题原因
你用dset[k][l]这种链式索引赋值时,dset[k]会生成一个临时拷贝数组,修改这个拷贝的元素并不会同步到HDF5文件中的原始数据集。当临时数组被销毁后,所有修改都会丢失,最终文件里保留的还是数据集初始化时的默认值0。
解决方法
方法1:使用二维索引直接赋值
直接通过逗号分隔的二维索引操作原数据集元素,修改会被持久化到文件:
import h5py output_file = h5py.File('output_file', 'w') dset = output_file.create_dataset('dset', (3, 3)) for k in range(3): for l in range(3): dset[k, l] = 1. # 改用逗号分隔的二维索引 output_file.close() # 必须关闭文件确保写入完成
方法2:批量赋值(更高效)
如果需要给整个数据集赋值,直接用numpy数组或切片操作,比循环更高效:
import h5py import numpy as np with h5py.File('output_file', 'w') as output_file: dset = output_file.create_dataset('dset', (3, 3)) # 方式一:用numpy数组批量赋值 arr = np.ones((3, 3)) dset[:] = arr # 方式二:直接用切片赋值 # dset[:, :] = 1.
读取代码(推荐用上下文管理器)
使用with语句可以自动管理文件资源,避免忘记关闭文件导致的问题:
import h5py with h5py.File('output_file', 'r') as file: print(file['dset'][:])
执行后输出会是:
[[1. 1. 1.] [1. 1. 1.] [1. 1. 1.]]
内容的提问来源于stack exchange,提问作者user2723984
相关产品推荐
相关产品推荐

