2

我正在尝试使用 HDF5 存储时间序列 EEG 数据。这些文件可能很大并且包含许多通道,我喜欢 HDF5 文件格式的特性(惰性 I/O、动态压缩、mpi 等)。

与 EEG 数据有关的一件常见事情是将数据部分标记为“有趣”。我正在努力寻找一种将这些标记存储在文件中的好方法。我看到支持将同一数据集链接到其他组等的软/硬链接 - 但我看不到任何链接到数据集部分的方法。

例如,假设我有一个名为 EEG 的数据集,其中包含睡眠数据。假设我运行了一个算法,该算法需要一段时间来处理数据并生成与 REM 睡眠周期相对应的索引。将这些索引范围存储在 HDF5 文件中的最佳方法是什么?

我现在能想到的最好的方法是创建一个包含三列的数据集——第一列是一个字符串,包含事件的标签(“REM1”),第二列/第三列分别包含开始/结束索引. 我不喜欢这个解决方案的唯一原因是因为 HDF5 数据集的大小相当固定——如果我后来决定错误识别了一段时间的 REM 睡眠并且我需要添加/删除该事件,那么数据集大小将需要更改(并删除数据集/使用新大小重新创建它是次优的)。再加上我可能有很多事件(想象标记眨眼事件),这变得更加成问题。

我更想知道 HDF5 文件中是否有我不知道的功能,因为这似乎是人们想要做的一件很常见的事情。

4

1 回答 1

1

我认为你想要的是一个区域引用——本质上,一种存储对数据片段的引用的方法。在h5py中,您使用属性和 numpy 切片语法创建它们regionref,因此如果您有一个名为的数据集ds以及您的 REM 周期startend索引,您可以执行以下操作:

rem_ref = ds.regionref[start:end]
ds.attrs['REM1'] = rem_ref
ds[ds.attrs['REM1']]  # Will be a 1-d set of values

您可以非常自然地存储 regionref——它们可以是数据集上的属性、组中的对象,或者您可以创建一个 regionref 类型的数据集并将它们存储在其中。

在您的情况下,我可能会创建一个组(“REM_periods”或其他东西)并将引用存储在其中。创建一个“REM_periods”数据集并在那里存储 regionrefs 也是合理的,但是你会遇到整个“数据集往往不是可变长度”的事情。

将它们作为 attrs 存储在数据集上也可能没问题,但如果您想要拥有一种以上的事件类型,就会变得很尴尬。

于 2016-04-15T15:48:25.473 回答