如何使用h5py覆盖h5文件中的数组

use*_*433 32 python arrays numpy h5py

我正在尝试覆盖一个numpy数组,这是一个相当复杂的h5文件的一小部分.

我正在提取数组,更改一些值,然后想要将数组重新插入到h5文件中.

我没有问题提取嵌套的数组.

f1 = h5py.File(file_name,'r')
X1 = f1['meas/frame1/data'].value
f1.close()
Run Code Online (Sandbox Code Playgroud)

我尝试过的代码看起来像这样但没有成功:

f1 = h5py.File(file_name,'r+')
dset = f1.create_dataset('meas/frame1/data', data=X1)
f1.close()
Run Code Online (Sandbox Code Playgroud)

作为一个完整性检查,我使用以下代码在Matlab中执行此操作,并且它没有任何问题.

h5write(file1, '/meas/frame1/data', X1);
Run Code Online (Sandbox Code Playgroud)

有没有人对如何成功做到这一点有任何建议?

ask*_*han 28

您想要分配值,而不是创建数据集:

f1 = h5py.File(file_name, 'r+')     # open the file
data = f1['meas/frame1/data']       # load the data
data[...] = X1                      # assign new values to data
f1.close()                          # close the file
Run Code Online (Sandbox Code Playgroud)

确认更改已正确完成并保存:

f1 = h5py.File(file_name, 'r')
np.allclose(f1['meas/frame1/data'].value, X1)
#True
Run Code Online (Sandbox Code Playgroud)

  • 那个`data [...] = X1`很关键!不要犯错误做`data = X1`. (13认同)

wea*_*rog 27

askewchan的答案描述了这样做的方法(你不能在已经存在的名称下创建数据集,但你当然可以修改数据集的数据).但请注意,数据集必须与X1您写入的数据()具有相同的形状.如果要将数据集替换为不同形状的其他数据集,则首先必须将其删除:

del f1['meas/frame1/data']
dset = f1.create_dataset('meas/frame1/data', data=X1)
Run Code Online (Sandbox Code Playgroud)