首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将hdf5文件转换为文本文件?

如何将hdf5文件转换为文本文件?
EN

Stack Overflow用户
提问于 2021-01-29 15:36:37
回答 1查看 772关注 0票数 0

一直试图读取一个.hdf5文件,以便绘制一些数据,为此,我认为我应该将.hdf5文件中的数据处理为.txt文件。为了检查数据,我最终使用了reading nested .h5 group into numpy array中的代码。

代码语言:javascript
运行
复制
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)

这导致了以下产出:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
f= h5py.File(float('15524.h5'), 'r')

但python指出:

代码语言:javascript
运行
复制
ValueError: could not convert string to float: '15524.h5'

我不经常编程,所以如果这是常识的话,我很抱歉。

EN

回答 1

Stack Overflow用户

发布于 2021-01-29 21:49:41

欢迎来到HDF5,在这里,数据模式可以是任何格式,您可以了解它。-)幸运的是,HDF5是自我描述的,所以只要有一些Python的魔力,我们就可以做到这一点。

是的,有些数据集是按行和列生成的,而另一些则更为复杂。检查形状和dtype是正确的起点。您遇到的数据集具有“类似于表”的结构。它有200行数据,每一行都有不同数据类型的命名字段(也称为列)(名称和类型由dtype定义)。有些值是整数(i4/i8),有些是浮点数(f4/f8,也就是实数),1是字符串(“type”),1是浮点数数组(“波形”)。以下是前几个字段名和类型:

(integer)

  • name:名称: digital_in,类型:

  • 名称: encoder_theta,类型:

  • 名称:编码器_x‘,类型:

  • 名称:编码器_y‘,类型:

  • name:编码器_z’,类型:

  • name: id',类型:'>f 215

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

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

代码语言:javascript
运行
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65957409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档