打开H5文件以在MNE Python中使用

3
我目前正在与The Virtual Brain (www.thevirtualbrain.org)合作开展项目,模拟了一些脑电图数据。为了进一步分析这些数据,我想在Python中打开这个模拟的时间序列,以便使用MNE包进行分析。然而,我只能以h5格式存储The Virtual Brain中的脑电图数据,并且我无法找出如何以一种可以用于使用MNE进行分析的方式打开此文件。
我可以在Python中读取h5文件并查看其描述:
文件键 <KeysViewHDF5 ['data', 'time']> 数据结构 <HDF5 dataset "data": shape (512, 2, 63, 1), type "<f8"> 时间结构 <HDF5 dataset "time": shape (512,), type "<f8">
但我不知道如何将这些数据实际用于再次分析它们作为脑电图。
有人有想法如何做到这一点吗?
谢谢!
Celien
2个回答

0

我曾经问过自己同样的问题。

我认为这可能会有所帮助。

TVB的TimeSeries.h5是一个带有2个数据集的hdf5文件:

  1. 数据(EEG跟踪)
  2. 时间

我们需要数据数据集(如果需要,也可以两个一起使用)。

import mne
import matplotlib.pyplot as plt
import numpy as np
from scipy.signal import welch
import h5py

with h5py.File('TVB_EEG.h5', 'r') as f:
    data = np.array(f['data'])
    
data = np.reshape(data, (data.shape[0], -1)).T

使用这些代码,我们将把TVB EEG数据转换为数组。

现在,我们需要创建信息和其他必要的内容,以完成转换为mne数据集(通道、采样频率等):

ch_names = ['Ch' + str(i + 1) for i in range(data.shape[0])]
ch_types = ['eeg' for i in range(data.shape[0])]
sfreq = 1 / (data.shape[1] / 1000)
info = mne.create_info(ch_names=ch_names, ch_types=ch_types, sfreq=sfreq)

raw = mne.io.RawArray(data, info)

print(raw.info)
print('Duration:', raw.times[-1], 'seconds')

输出:

Creating RawArray with float64 data, n_channels=63, n_times=10000
    Range : 0 ... 9999 =      0.000 ... 99990.000 secs
Ready.
<Info | 7 non-empty values
 bads: []
 ch_names: Ch1, Ch2, Ch3, Ch4, Ch5, Ch6, Ch7, Ch8, Ch9, Ch10, Ch11, Ch12, ...
 chs: 63 EEG
 custom_ref_applied: False
 highpass: 0.0 Hz
 lowpass: 0.1 Hz
 meas_date: unspecified
 nchan: 63
 projs: []
 sfreq: 0.1 Hz
>
Duration: 99990.0 seconds

现在您可以在mne上处理TVB EEG文件:

示例:

fig, ax = plt.subplots(figsize=[20, 5])
start_time = 0
end_time = 99990

ax.plot(raw.get_data(picks=2, tmin=start_time, tmax=end_time).T)
plt.show()



raw.plot_psd(fmin= 0, fmax=0.045)
plt.show()

0

'keys' 是 HDF5 节点(组或数据集)的名称。要熟练掌握,您需要了解 HDF5 文件架构。花些时间查看The HDF Group的 HDF5 文档。我推荐这个文档:Introduction to HDF5

根据您上面的输出,您有 2 个数据集:

  1. HDF5 数据集 "data": 形状为 (512, 2, 63, 1),类型为 "<f8">
  2. HDF5 数据集 "time": 形状为 (512,),类型为 "<f8">

h5py 将数据集检索为 NumPy 数组。形状是数组的形状属性,类型是 dtype 属性。(熟悉 NumPy 也很有帮助。)在这种情况下,所有值都是浮点数。两个数据集都有 512 行,但不同的维度。我怀疑 time 数据集保存了您的时间值。您将不得不探索 data 数据集以了解该数据的组织方式。

这里是根据你的问题细节检索数据的伪代码。 data_arrtime_arr 是关联数据集的NumPy数组。
with h5py.File('yourfile.h5','r') as h5f:
    data_arr = h5f['data'][:]
    time_arr = h5f['time'][:]

一旦您将数据转换为NumPy数组,就可以使用Python和NumPy操作来处理它。这应该能让您入门。尝试一下,看看您可以如何使用data_arrtime_arr。注意:这是有关HDF5和h5py的快速概述。这个主题还有很多内容。
请注意,我使用了Python的上下文管理器with/as:而不是简单的h5py.File()调用。这是首选方法,并为您管理文件关闭操作(无需h5f.close())。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接