【问题标题】:Can I delete an element from an HDF5 dataset?我可以从 HDF5 数据集中删除元素吗?
【发布时间】:2018-10-17 17:58:06
【问题描述】:

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

删除HDF5Dataset.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 数据集,我想单独删除一个或多个元素,例如

删除HDF5DatasetElement.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

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

谢谢,如果我的任何术语不正确,我们深表歉意。

【问题讨论】:

  • 您的mydataset 数据集是什么样的?它是float 数组还是其他? 一般来说,HDF5 并不是删除数据的最佳选择,因为默认情况下不会释放磁盘空间。
  • 在我正在使用的当前案例中,这是一个元组
  • HDF5 文件没有tuple 的概念。 HDF5是C语言编写的跨平台数据格式,打印f['Log list'][3]看到什么?
  • ('string_example',)
  • 是的,也许它不是一个元组,但它确实看起来像一个类似于元组的奇怪形式的数组

标签: python hdf5


【解决方案1】:

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

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

【讨论】:

  • 这正是我想要的,除了当我运行它时,我在最后一行得到一个错误,上面写着“无法创建链接(名称已经存在)”。我正在调试它,但如果您知道为什么会这样,将不胜感激,谢谢!
  • 好的,这似乎是一个覆盖问题。我在你的最后一行之前添加了一行“f.__delitem__('Log list')”,它可以工作。如果您在其中添加,我会接受答案,谢谢!
猜你喜欢
  • 2014-12-19
  • 2017-11-19
  • 2022-06-14
  • 1970-01-01
  • 1970-01-01
  • 2019-03-10
  • 1970-01-01
  • 2015-10-29
相关资源
最近更新 更多