Skip to main content
 首页 » 编程设计

python之将分层数据存储到 hdf5之如何构建它们

2025年05月04日8lexus

我需要将分层数据结构存储到 hdf5 中,其中大部分叶节点是非数组类型(字符串或标量),其中只有少数是同构数组。这些数据看起来类似于:

/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中。

请您参考如下方法:

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 中导入应该是小菜一碟。