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

Python 我可以从HDF5数据集中删除元素吗?,python,hdf5,Python,Hdf5,我想从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') # This co

我想从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')
# 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
然而,这不是我想做的。”mydatatset’是一个包含多个元素的HDF5数据集,例如,我想分别删除一个或多个元素

删除hdf5datasetelement.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')
# 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中存储字符串的方法,但假设您在如何存储数据方面没有选择

HDF5希望您保持阵列大小不变。诸如删除任意元素之类的操作代价高昂。此外,使用HDF5,删除数据时不会自动释放空间

在此之后,如果仍要删除指定格式的数据,可以尝试提取数组,删除元素,然后重新分配到数据集:

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

您的
mydataset
dataset看起来像什么?它是一个
float
数组还是其他什么?一般来说,HDF5不是删除数据的最佳选择,因为默认情况下不会释放磁盘空间。在当前情况下,HDF5是一个元组。我正在处理的HDF5文件没有元组的概念。HDF5是一种用C编写的跨平台数据格式。当你打印
f['Log list'][3]
?('string_example')时,你会看到什么?('string_example')是的,也许它不是一个元组,但它看起来确实像是一个类似元组的数组的奇怪形式。这正是我想要的,除非当我运行它时,我在最后一行得到一个错误,即“无法创建链接(名称已存在)”。我正在调试它,但如果您知道发生这种情况的原因,将不胜感激,谢谢!好的,这似乎是一个覆盖问题。我在您的最后一行之前添加了一行“f.\u delitem\uuuu('Log list')”,它可以工作。如果您在其中添加该行,我将接受答案,谢谢!