【问题标题】:How can I transform a hdf5 file into a text file?如何将 hdf5 文件转换为文本文件?
【发布时间】:2021-05-03 13:06:34
【问题描述】:

一直在尝试读取 .hdf5 文件以便绘制一些数据,为此我想我会将 .hdf5 文件中的数据处理成 .txt 文件。为了检查数据,我最终使用了reading nested .h5 group into numpy array 中提供的代码。

import numpy as np
import h5py


f = h5py.File('15524.h5', 'r')

list(f.keys())
dset = f['Measurement_15524']


def traverse_datasets(hdf_file):

    def h5py_dataset_iterator(g, prefix=''):
        for key in g.keys():
            item = g[key]
            path = f'{prefix}/{key}'
            if isinstance(item, h5py.Dataset): # test for dataset
                yield (path, item)
            elif isinstance(item, h5py.Group): # test for group (go down)
                yield from h5py_dataset_iterator(item, path)

    for path, _ in h5py_dataset_iterator(hdf_file):
        yield path


with h5py.File('15524.h5', 'r') as f:
    for dset in traverse_datasets(f):
        print('Path:', dset)
        print('Shape:', f[dset].shape)
        print('Data type:', f[dset].dtype)

这导致以下输出:

Path: /Measurement_15524/Waveforms/waveforms_0
Shape: (200,)
Data type: [('digital_in', '<i4'), ('encoder_phi', '<f4'), ('encoder_theta', '<f4'), ('encoder_x',
         '<f4'), ('encoder_y', '<f4'), ('encoder_z', '<f4'), ('id', '<i8'), ('line_index', '<i4'), 
        ('motor_phi', '<f4'), ('motor_theta', '<f4'), ('motor_x', '<f4'), ('motor_y', '<f4'), ('motor_z',
        '<f4'), ('sweep_dir', 'i1'), ('timestamp', '<f8'), ('type', 'S9'), ('waveform', '<f8', (4096,)),
        ('x_offset', '<f8'), ('x_spacing', '<f8')]

我认为数据应该以列和行的形式呈现,我怎样才能以这种方式可视化输出?

如何将其转换为 .txt 文件?

有人告诉我这个问题可能是由于数据是 str 而不是浮动的,所以我试图通过将第三行 f 替换为:

f= h5py.File(float('15524.h5'), 'r')

但是python声明:

ValueError: could not convert string to float: '15524.h5'

我不经常编程,如果这是常识,我深表歉意。

【问题讨论】:

    标签: python-3.x hdf5 txt


    【解决方案1】:

    欢迎使用 HDF5,其中的数据架构几乎可以是任何格式,您可以自己弄清楚。 :-) 幸运的是,HDF5 是自描述的,所以我们可以通过一点 Python 魔法来做到这一点。

    是的,一些数据集是按行和列排列的;其他的更复杂。检查 shape 和 dtype 是正确的起点。您遇到的数据集具有“类似表”的结构。它有 200 行数据,每一行都有不同数据类型的命名字段(又名列)(名称和类型由 dtype 定义)。您的一些值是整数(i4/i8),一些是浮点数(f4/f8 aka real numbers),1 是字符串('type'),1 是浮点数组('waveform')。以下是前几个字段名称和类型:

    • 名称:digital_in,类型:
    • 名称:encoder_phi,类型:
    • 名称:encoder_theta,类型:
    • 名称:encoder_x',类型:
    • 名称:encoder_y',类型:
    • 名称:encoder_z',类型:
    • 名称:id',类型:'

    您要在/Measurement_15524/Waveforms/waveforms_0 数据集中绘制的值吗?如果是这样,您可以作为 h5py 数据集对象或 NumPy 数组(将作为“记录数组”返回)访问此数据。从那里,将数据写入 csv(逗号分隔值文件)以与另一个应用程序一起绘制是“相对简单的”。您可以将整个数据集写入文件,或者(使用更多编码)您可以只写入要绘制的 2 列。添加有关您要绘制的列的一些详细信息(如 X 和 Y),我可以创建一些原型代码。或者,您可以使用 matplotlib 包并使用 Python 创建绘图。

    注意:上面的方法没有什么问题,但是如果你是 Python 新手,可能会很难理解。有一种更简单的方法可以使用 h5py .visit().visititems() 方法遍历 HDF5 数据结构。下面的代码将对.visititems() 执行相同的操作。所有检查都在“访问者功能”中完成(本例中为traverse_nodes())。它不做的事情是返回调用函数的路径。

    import numpy as np
    import h5py
    
    def traverse_nodes(name, node):
        if isinstance(node, h5py.Group):
            print('\n',node.name, 'is a Group')
        elif isinstance(node, h5py.Dataset):
            print('\n',node.name, 'is a Dataset')
            print('Path:', name)
            print('Shape:', node.shape)
            print('Data type:', node.dtype)
            
            
    with h5py.File('15524.h5', 'r') as h5f:
        h5f.visititems(traverse_nodes)
    

    【讨论】:

      猜你喜欢
      • 2017-05-20
      • 2016-12-13
      • 1970-01-01
      • 2015-08-30
      • 2014-07-08
      • 2019-08-07
      • 2023-03-15
      • 2012-06-22
      • 1970-01-01
      相关资源
      最近更新 更多