Quiet
  • 主页
  • 归档
  • 分类
  • 标签
  • 链接
  • 关于我

bajiu

  • 主页
  • 归档
  • 分类
  • 标签
  • 链接
  • 关于我
Quiet主题

HDF5 介绍

bajiu
生物信息学

2023-03-29 10:54:27

HDF5介绍

HDF 是用于存储和分发科学数据的一种自我描述、多对象文件格式。HDF 是由美国国家超级计算应用中心(NCSA)创建的,以满足不同群体的科学家在不同工程项目领域之需要。HDF 可以表示出科学数据存储和分布的许多必要条件。HDF 被设计为:

  • 自述性:对于一个HDF 文件里的每一个数据对象,有关于该数据的综合信息(元数据)。在没有任何外部信息的情况下,HDF 允许应用程序解释HDF文件的结构和内容。
  • 通用性:许多数据类型都可以被嵌入在一个HDF文件里。例如,通过使用合适的HDF 数据结构,符号、数字和图形数据可以同时存储在一个HDF 文件里。
  • 灵活性:HDF允许用户把相关的数据对象组合在一起,放到一个分层结构中,向数据对象添加描述和标签。它还允许用户把科学数据放到多个HDF 文件里。
  • 扩展性:HDF极易容纳将来新增加的数据模式,容易与其他标准格式兼容。
  • 跨平台性:HDF 是一个与平台无关的文件格式。HDF 文件无需任何转换就可以在不同平台上使用。

(官方介绍:https://support.hdfgroup.org/HDF5/whatishdf5.html)

HDF5 结构

HDF5文件一般以.h5或者.hdf5作为后缀名,需要专门的软件才能打开预览文件的内容。

HDF5文件结构中有2 primary objects: Groups 和 Datasets。

  • Groups就类似于文件夹,每个HDF5文件其实就是根目录 **(root) group’/‘**。
  • Datasets类似于NumPy中的数组 array 。

HDF5_Cover

每个 dataset 可以分成两部分: 原始数据 (raw) data values 和 元数据 metadata (a set of data that describes and gives information about other data => raw data)。

+-- Dataset
|   +-- (Raw) Data Values (eg: a 4 x 5 x 6 matrix)
|   +-- Metadata
|   |   +-- Dataspace (eg: Rank = 3, Dimensions = {4, 5, 6})
|   |   +-- Datatype (eg: Integer)
|   |   +-- Properties (eg: Chuncked, Compressed)
|   |   +-- Attributes (eg: attr1 = 32.4, attr2 = "hello", ...)
|

从上面的结构中可以看出:

  • Dataspace 给出原始数据的秩 (Rank) 和维度 (dimension)
  • Datatype 给出数据类型
  • Properties 说明该 dataset 的分块储存以及压缩情况
  • Chunked: Better access time for subsets; extendible
  • Chunked & Compressed: Improves storage efficiency, transmission speed
  • Attributes 为该 dataset 的其他自定义属性

整个HDF5文件的结构如下所示:

+-- /
|   +-- group_1
|   |   +-- dataset_1_1
|   |   |   +-- attribute_1_1_1
|   |   |   +-- attribute_1_1_2
|   |   |   +-- ...
|   |   |
|   |   +-- dataset_1_2
|   |   |   +-- attribute_1_2_1
|   |   |   +-- attribute_1_2_2
|   |   |   +-- ...
|   |   |
|   |   +-- ...
|   |
|   +-- group_2
|   |   +-- dataset_2_1
|   |   |   +-- attribute_2_1_1
|   |   |   +-- attribute_2_1_2
|   |   |   +-- ...
|   |   |
|   |   +-- dataset_2_2
|   |   |   +-- attribute_2_2_1
|   |   |   +-- attribute_2_2_2
|   |   |   +-- ...
|   |   |
|   |   +-- ...
|   |
|   +-- ...
|

Python 读写 HDF5 文件

HDF5的python库h5py调用:

import h5py
import numpy as np

# 保存数据为 HDF5 文件
with h5py.File('../out/compressed_data.h5', 'w') as f:
     # 创建一个数据集,并使用 gzip 压缩
    dset = f.create_dataset('data', data=data, compression='gzip', compression_opts=9)
    # 打印数据
    print(data)

c# 读取 HDF5 文件

https://apollo3zehn.github.io/PureHDF/reading/index.html

using System;
using PureHDF;

class Program
{
    static void Main(string[] args)
    {
        // 打开 HDF5 文件
        using (var file = Hdf5.OpenFile("compressed_data.h5"))
        {
            // 打开数据集
            using (var dataset = file.OpenDataset("data"))
            {
                // 获取数据集的维度
                var dims = dataset.Dimensions;
                Console.WriteLine($"Data shape: ({string.Join(", ", dims)})");
                // 读取数据
                float[,,,] data = new float[dims[0], dims[1], dims[2], dims[3]];
                dataset.Read(data);
                // 使用数据...
                // 例如,打印第一个元素
                Console.WriteLine($"First element: {data[0, 0, 0, 0]}");
            }
        }
    }
}
上一篇

单细胞数据格式之loom文件

下一篇

使用oro.dicom查看Dicom数据

©2024 By bajiu.