我可以从 HDF5 数据集中删除元素吗?

Can I delete an element from an HDF5 dataset?

我想从 Python 中的 HDF5 数据集中删除一个元素。下面是我的示例代码

DeleteHDF5Dataset.py

# This code works, which deletes an HDF5 dataset from an HDF5 file

file_name = os.path.join('myfilepath', 'myfilename.hdf5')
f = h5py.File(file_name, 'r+')
f.__delitem__('Log list')

然而,这不是我想做的。 'mydatatset'是一个HDF5数据集,有几个元素,我想单独删除一个或多个元素,例如

DeleteHDF5DatasetElement.py

# This code does not work, but I would like to achieve what it's trying to do

file_name = os.path.join('myfilepath', 'myfilename.hdf5')
f = h5py.File(file_name, 'r+')

print(f['Log list'][3]) # prints the correct dataset element

f.__delitem__('Log list')[3]  # I want to delete element 3 of this HDF5 dataset

我能想到的最佳解决方案是创建一个临时数据集,遍历原始数据集,只将我想保留的条目添加到临时数据集,然后用新数据集替换旧数据集.但这看起来很笨重。有没有人有一个干净的解决方案来做到这一点?似乎应该有一种简单的方法来删除一个元素。

谢谢,如果我的术语有误,请见谅。

看起来你有一个字符串数组。这不是在 HDF5 中存储字符串的 recommended way,但我们假设您无法选择数据的存储方式。

HDF5 更喜欢 你保持数组大小固定。诸如删除任意元素之类的操作是昂贵的。此外,对于 HDF5,删除数据时 space 不会自动释放。

在这一切之后,如果您仍然想删除指定格式的数据,您可以尝试简单地提取一个数组,删除一个元素,然后重新分配给您的数据集:

arr = f['Log list'][:]  # extract to numpy array
res = np.delete(arr, 1)  # delete element with index 1, i.e. second element
f.__delitem__('Log list')  # delete existing dataset
f['Log list'] = res  # reassign to dataset