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

52 投票
3 回答
51733 浏览
提问于 2025-04-18 01:46

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

我先提取出这个数组,修改一些值,然后想把这个数组重新放回h5文件里。

提取嵌套的数组对我来说没问题。

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

我尝试的代码大概是这样的,但没有成功:

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

为了确认我的思路,我在Matlab中执行了以下代码,结果没有问题。

h5write(file1, '/meas/frame1/data', X1);

有没有人能给我一些建议,教我怎么才能成功做到这一点?

3 个回答

3

不同的情况:

  1. 对数据集进行部分修改
with h5py.File(file_name,'r+') as ds:
  ds['meas/frame1/data'][5] = val # change index 5 to scalar "val"
  ds['meas/frame1/data'][3:7] = vals # change values of indices 3--6 to "vals"
  1. 改变数据集中每个值(数据集大小相同)
with h5py.File(file_name,'r+') as ds:
  ds['meas/frame1/data'][...] = X1 # change array values to those of "X1"
  1. 将数据集覆盖为不同大小的一个数据集
with h5py.File(file_name,'r+') as ds:
  del ds['meas/frame1/data'] # delete old, differently sized dataset
  ds.create_dataset('meas/frame1/data',data=X1) # implant new-shaped dataset "X1"

因为文件对象是一个上下文管理器,使用with语句可以很好地组织你的代码,并在你完成对数据集的修改后自动关闭它。(如果你只是需要读取数据,就不想保持读写模式!)

44

askewchan的回答讲述了如何操作(你不能在已经存在的名字下创建一个数据集,但你当然可以修改这个数据集里的数据)。不过要注意,数据集的形状必须和你要写入的数据(X1)的形状相同。如果你想要用一个形状不同的其他数据集来替换这个数据集,你首先得把它删除:

del f1['meas/frame1/data']
dset = f1.create_dataset('meas/frame1/data', data=X1)

54

你想要的是给变量赋值,而不是创建一个数据集:

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

要确认这些更改已经正确地做了并且保存了:

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

撰写回答