一直试图读取一个.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'
我不经常编程,所以如果这是常识的话,我很抱歉。
发布于 2021-01-29 21:49:41
欢迎来到HDF5,在这里,数据模式可以是任何格式,您可以了解它。-)幸运的是,HDF5是自我描述的,所以只要有一些Python的魔力,我们就可以做到这一点。
是的,有些数据集是按行和列生成的,而另一些则更为复杂。检查形状和dtype是正确的起点。您遇到的数据集具有“类似于表”的结构。它有200行数据,每一行都有不同数据类型的命名字段(也称为列)(名称和类型由dtype定义)。有些值是整数(i4/i8),有些是浮点数(f4/f8,也就是实数),1是字符串(“type”),1是浮点数数组(“波形”)。以下是前几个字段名和类型:
(integer)
您想要在/Measurement_15524/Waveforms/waveforms_0
数据集中绘制的值吗?如果是这样,您可以以h5py dataset对象或NumPy数组的形式访问这些数据(将作为“记录数组”返回)。从那里开始,将数据写入csv (逗号分隔值的文件)与另一个应用程序进行绘图是“相对简单的”。您可以将整个数据集写入文件,或者(再编写一点代码)只需编写想要绘制的2列。添加一些关于你想要绘制的列的细节(如X和Y),我可以创建一些原型代码。或者,您可以使用matplotlib包并使用Python创建您的情节。
注意:上面的方法没有什么问题,但是如果您是Python新手,可能很难理解。有一种使用h5py、.visit()
或.visititems()
方法遍历h5py数据结构的更简单的方法。下面的代码将对.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)
https://stackoverflow.com/questions/65957409
复制相似问题