编辑 HDF5 矩阵值
Editing HDF5 matrix values
我正在尝试编辑以 hdf5 格式提供给我的数据集,然后重新保存它。我以前能够编辑 hdf5 文件中的值,但在这种特殊情况下,我的旧方法似乎不起作用(我将在下面展示这两个示例)。
我有一个从 HDF5 文件中提取的形状为 (101, 4, 2) 的 3D 数据集。出于本示例的目的,我随后尝试将每个值设置为浮点值 1.0。
file_name = r'C:\Labber\Data18\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\Data18\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\Data18\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] = 1.0
h5entry[i][0][1]
可以获取值,但不能用于设置,因为 h5entry[i]
是数据集的副本,而不是 view
。 h5entry[i]
是数组,不是数据集。
entry[i][0][1] = 1.0
之所以有效,是因为 entry
已经是一个 ndarray
,而 entry[i]
是一个 view
,entry[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']
是数据集,而不是数据集的副本。
我正在尝试编辑以 hdf5 格式提供给我的数据集,然后重新保存它。我以前能够编辑 hdf5 文件中的值,但在这种特殊情况下,我的旧方法似乎不起作用(我将在下面展示这两个示例)。
我有一个从 HDF5 文件中提取的形状为 (101, 4, 2) 的 3D 数据集。出于本示例的目的,我随后尝试将每个值设置为浮点值 1.0。
file_name = r'C:\Labber\Data18\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\Data18\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\Data18\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] = 1.0
h5entry[i][0][1]
可以获取值,但不能用于设置,因为 h5entry[i]
是数据集的副本,而不是 view
。 h5entry[i]
是数组,不是数据集。
entry[i][0][1] = 1.0
之所以有效,是因为 entry
已经是一个 ndarray
,而 entry[i]
是一个 view
,entry[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']
是数据集,而不是数据集的副本。