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

50

我试图覆盖一个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个回答

52
你想分配数值,而不是创建数据集:
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

23
data[...] = X1 非常关键!不要犯把 data = X1 的错误。 - pattivacek
第二个代码块只是用来检查是否一切都已关闭,对吧?因此前四行才是真正的工作。 - Dusch
1
另一个需要注意的地方是,您必须覆盖完整的单个数据点;因此,如果您的数据是例如 3D 点,则必须更新完整的 3D 点。对于数据点的一个元素的更改(例如仅 Z 坐标),将不会改变任何内容。 - Oliver Zendel
@Dusch,你说得对,这只是一个检查,前四行代码已经完成了任务,但实际上它并没有关闭任何东西,而是检查值是否匹配。请参阅np.allclose - askewchan
如果我们只是更新数据集的一部分,那么是否需要使用“附加”操作符?例如,如果我们执行data[5:] = X1,其中len(data) = len(X1)+5,是否需要使用“附加”操作符? - Bremsstrahlung

43
askewchan的回答描述了如何操作(您不能创建一个已经存在的数据集名称,但您可以修改数据集的数据)。然而,请注意,数据集必须与您正在写入的数据(X1)具有相同的形状。如果您想要用不同形状的其他数据集替换该数据集,您首先需要删除它:

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

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语句是一种很好的方式来封装您的代码,并在完成数据集更改后自动关闭。 (如果您只需要读取数据,则不要处于读/写模式!)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接