将分层数据存储到hdf5中 - 如何构建它们

时间:2013-03-12 15:49:53

标签: python hdf5

我需要将分层数据结构存储到hdf5中,其中大多数叶子节点是非数组类型(字符串或标量),onyl中的一些是同构数组。这些数据与此类似:

/simulation-20130312_13:33p1435
   +- input
   |  +- gravity = 9.81
   |  +- timeScale = 1.0
   |  +- userTitle = 'real'
   |  +- flowRates = [ 1.1, 2.1 ]
   |  +- material
   |     +- density = 1234.2
   |     +- young = 1.123e6
   |     +- temp = 290.2
   +- finished = '20130312_16:21'
   +- host = 'efflux.local'
   +- series
      +- t = [0,1e-5,2e-5,...,3.4e-4]
      +- Ek = [0,...]
/simulation-20130312_13:55p1657
   ...
   ...

每个模拟下的数据结构相似,但不一定相同,所以我认为使用表是不可能的。

我应该为所有叶子创建组,并始终将值设置为附加到该叶子的数组 - 如果值是标量,则使用1x1数组?我应该对除真实数组之外的所有数据使用组属性吗?那些使用这些文件的人不会感到困惑吗?

我几乎没有使用hdf5的经验;数据的数量相对较少,此时对效率的关注不大 - 重要的是能够轻松地将数据导入到Matlab中。

1 个答案:

答案 0 :(得分:1)

HDF5代表分层数据格式,它显然是存储像您这样的层次结构的正确工具。

我建议您将树叶存储为数据集:

  • 为标量使用标量数据集(字符串,数字,flowRates也可以被视为数组大小为2的标量

  • 使用简单数据集作为时间序列

并为所有其他节点创建组,如下所示:

/simulation-20130312_13:33p1435       # root group: /
   +- input                           # group: /input
   |  +- gravity = 9.81               # scalar double
   |  +- timeScale = 1.0              # scalar double
   |  +- userTitle = 'real'           # scalar string
   |  +- flowRates = [ 1.1, 2.1 ]     # scalar array[2]
   |  +- material                     # group: /input/material
   |     +- density = 1234.2          # scalar double
   |     +- young = 1.123e6           # scalar double
   |     +- temp = 290.2              # scalar double
   +- finished = '20130312_16:21'     # scalar string
   +- host = 'efflux.local'           # scalar string
   +- series                          # group: /series
      +- t = [0,1e-5,2e-5,...,3.4e-4] # simple dataset double
      +- Ek = [0,...]                 # simple dataset double

Matlab中的导入应该是小菜一碟。