Python 编辑HDF5矩阵值

Python 编辑HDF5矩阵值,python,hdf5,h5py,Python,Hdf5,H5py,我正在尝试编辑以hdf5格式提供给我的数据集,然后重新保存它。我以前能够编辑hdf5文件中的值,但在这种特殊情况下,我的旧方法似乎不起作用(我将在下面展示这两个示例) 我有一个形状(101,4,2)的3D数据集,我从HDF5文件中提取。在本例中,我尝试将每个值设置为浮点值1.0 file_name = r'C:\Labber\Data\2018\06\Data_0601\CSing.hdf5' f = h5py.File(file_name, 'r+') h5entry = f['/Data/D

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

我有一个形状(101,4,2)的3D数据集,我从HDF5文件中提取。在本例中,我尝试将每个值设置为浮点值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

这是有效的。关于这里发生了什么以及如何以最有效的方式完成这项工作,有什么想法吗?

问题在于多步骤索引

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

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


因为
条目
已经是一个
数组
,而
条目[i]
是一个
视图
,就像
条目[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']
是数据集,而不是数据集的副本。

问题在于多步骤索引

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

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


因为
条目
已经是一个
数组
,而
条目[i]
是一个
视图
,就像
条目[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']
是数据集,而不是数据集的副本。

感谢简单的解决方案和精彩的解释感谢简单的解决方案和精彩的解释