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);

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

4

3 回答 3

46

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

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
于 2014-04-07T23:50:08.590 回答
38

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

del f1['meas/frame1/data']
dset = f1.create_dataset('meas/frame1/data', data=X1)
于 2014-04-08T18:44:59.597 回答
0

不同的场景:

  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"

由于 File 对象是上下文管理器,因此使用 with 语句是打包代码的好方法,并在完成更改后自动关闭数据集。(如果您只需要读取数据,您不想处于读/写模式!)

于 2021-10-13T11:03:16.880 回答