编辑HDF5矩阵值

时间:2018-06-01 16:21:46

标签: python hdf5 h5py

我正在尝试编辑以hdf5格式提供给我的数据集,然后重新保存。我以前能够在hdf5文件中编辑值,但似乎在这种特殊情况下我的旧方法不起作用(我将在下面显示两个示例)。

我有一个从HDF5文件中提取的形状(101,4,2)的3D数据集。出于本示例的目的,我尝试将每个值设置为浮点值1.0。

file_name = r'C:\Labber\Data\2018\06\Data_0601\CSing.hdf5'
f = h5py.File(file_name, 'r+')
h5entry = f['/Data/Data']

for i in range(len(h5entry[:,0,0])):
    print(h5entry[i][0][1]) #prints 0.0
    h5entry[i][0][1] = 1.0 
    print(h5entry[i][0][1]) #still prints 0.0

如果我创建一个numpy数组而不是对HDF5数据集的引用,我可以让它工作。

file_name = r'C:\Labber\Data\2018\06\Data_0601\CSing.hdf5'
f = h5py.File(file_name, 'r+')
entry = np.array(f['/Data/Data'])

for i in range(len(entry[:,0,0])):
    print(entry[i][0][1]) #prints 0.0
    entry[i][0][1] = 1.0 
    print(entry[i][0][1]) #prints 1.0

但后来我遇到了一个numpy数组格式的输入问题,我不能轻易地将数据集设置为等于数组。我可能可以从这个数组创建一个新数据集,删除旧数据集,然后重新分配新数据集,但这似乎是一种非常笨重的做事方式。

此外,我之前能够直接编辑HDF5键,这让我更加困惑。例如,我在

之前成功完成了以下操作
file_name = r'C:\Labber\Data\2018\06\Data_0601\CSing.hdf5'
f = h5py.File(file_name, 'r+')
entry = f['Step list'][i]
entry['use_relations'] = relations
f['Step list'][i] = entry

这很有效。关于这里发生了什么以及如何以最有效的方式实现这一目标的任何想法?

1 个答案:

答案 0 :(得分:1)

问题在于多步索引

h5entry[i][0][1] = 1.0

h5entry[i,0,1] = 1.0

h5entry[i][0][1]可以提取值,但不适用于设置,因为h5entry[i]是数据集的副本,而不是viewh5entry[i]是一个数组,而不是数据集。

entry[i][0][1] = 1.0

有效,因为entry已经是ndarrayentry[i]viewentry[i][0]也是如此。另一方面,阵列上的高级索引不起作用:entry[[1,2]][:,0][:,1]=3因为entry[[1,2]]是副本。

由于视图与副本的这些细微差别,使用单步索引通常更安全,无论是使用h5py还是ndarray

entry[[0,1],0,1] = 3

如果我们在编制索引时包含隐式:,有时会有所帮助:

entry[i,:,:][0,:][1]

代码不需要它,但我知道。我需要提醒一下我在每个阶段都要处理多少维度。

f['Step list'][i] = entry

有效,因为f['Step list']是数据集,而不是数据集的副本。