当前位置: 首页 > article >正文

用Python处理DREAMER脑电数据集:从.mat文件到.npy文件的完整实战教程

用Python处理DREAMER脑电数据集从.mat文件到.npy文件的完整实战教程在情感计算与神经科学交叉领域DREAMER数据集因其同时包含脑电信号EEG和情感评分而备受研究者青睐。但原始数据以.mat格式存储这种MATLAB专属格式对Python开发者并不友好。本文将手把手带你完成从数据解构到格式转换的全流程最终生成可直接用于PyTorch/TensorFlow训练的.npy文件。1. 理解DREAMER数据结构在动手写代码前我们需要像外科医生解剖人体一样理清数据层次。通过scipy.io.loadmat加载数据后你会得到一个嵌套字典结构import scipy.io as sio raw_data sio.loadmat(DREAMER.mat)[DREAMER][0,0]关键数据结构解析数据层级描述维度信息Data23名被试的主容器(23,)EEG每个被试的脑电记录包含baseline/stimulibaseline静息状态基准信号(7808,) per videostimuli视频刺激期间的脑电信号(25472, 14)ScoreValence效价评分1-5(18,) per subjectScoreArousal唤醒度评分1-5(18,) per subject注意MATLAB的.mat文件在Python中会被转换为numpy的ndarray但保留了MATLAB的1-based索引习惯因此需要通过[0,0]访问最外层数据。2. 数据提取核心代码实现2.1 电极信号提取函数我们设计一个支持批量处理的提取器避免原始代码中的硬编码问题def extract_eeg_signals(raw, participants23, videos18, electrodes14): 三维张量提取参与者×视频×电极信号 eeg_container np.zeros((participants, videos, electrodes, 25472)) for p in range(participants): for v in range(videos): for e in range(electrodes): signal_path raw[Data][0,p][EEG][0,0][stimuli][0,0][v,0][:,e] eeg_container[p,v,e] signal_path return eeg_container这段代码改进在于使用描述性变量名替代p/v/e等缩写预设输出张量维度明确保留原始采样点数25472而非降采样2.2 情感标签同步提取情感评分需要与EEG信号严格对齐def get_emotion_labels(raw): labels { valence: np.zeros((23, 18)), arousal: np.zeros((23, 18)), dominance: np.zeros((23, 18)) } for p in range(23): labels[valence][p] raw[Data][0,p][ScoreValence][0,0].flatten() labels[arousal][p] raw[Data][0,p][ScoreArousal][0,0].flatten() labels[dominance][p] raw[Data][0,p][ScoreDominance][0,0].flatten() return labels3. 数据预处理关键步骤3.1 信号标准化方案不同电极间的信号幅度差异需要消除from sklearn.preprocessing import RobustScaler def normalize_eeg(eeg_data): 使用RobustScaler处理每个电极的信号 避免异常值影响 original_shape eeg_data.shape flattened eeg_data.reshape(-1, original_shape[-1]) scaler RobustScaler() normalized scaler.fit_transform(flattened) return normalized.reshape(original_shape)提示相比MinMaxScalerRobustScaler对脑电信号中的突发噪声更具鲁棒性3.2 数据分割策略将长时序信号切分为适合神经网络的片段def segment_signal(signal, window_size128, overlap0.5): 滑动窗口分割时序信号 segments [] step int(window_size * (1 - overlap)) for start in range(0, len(signal)-window_size, step): segments.append(signal[start:startwindow_size]) return np.array(segments)4. 工程化存储方案4.1 按参与者保存NPY文件def save_participant_npy(eeg_data, labels, output_dir): os.makedirs(output_dir, exist_okTrue) for p in range(eeg_data.shape[0]): participant_data { eeg: eeg_data[p], valence: labels[valence][p], arousal: labels[arousal][p], dominance: labels[dominance][p] } np.save(f{output_dir}/participant_{p:02d}.npy, participant_data)4.2 数据校验机制保存后应立即验证数据完整性def validate_npy_files(output_dir, expected_participants23): missing_files [] corrupted_files [] for p in range(expected_participants): file_path f{output_dir}/participant_{p:02d}.npy if not os.path.exists(file_path): missing_files.append(p) continue try: data np.load(file_path, allow_pickleTrue).item() assert data[eeg].shape (18, 14, 25472) except: corrupted_files.append(p) return missing_files, corrupted_files5. 高级技巧与性能优化5.1 内存映射处理大文件当内存不足时使用numpy的memmap功能def process_large_mat(file_path): # 先加载小部分数据获取维度信息 sample sio.loadmat(file_path, variable_names[DREAMER]) full_shape sample[DREAMER].shape # 创建内存映射 mmap sio.loadmat(file_path, mat_dtypeTrue, struct_as_recordFalse, squeeze_meTrue, matlab_compatibleFalse, variable_names[DREAMER], appendmatFalse) return mmap[DREAMER]5.2 并行化提取加速使用joblib加速多参与者数据处理from joblib import Parallel, delayed def parallel_extract(raw, n_jobs4): def process_one(p): return extract_eeg_signals(raw, participants1, startp) results Parallel(n_jobsn_jobs)( delayed(process_one)(p) for p in range(23)) return np.concatenate(results, axis0)6. 实际应用案例6.1 PyTorch数据加载器实现import torch from torch.utils.data import Dataset class DreamerDataset(Dataset): def __init__(self, npy_dir): self.files [f for f in os.listdir(npy_dir) if f.endswith(.npy)] self.paths [os.path.join(npy_dir,f) for f in self.files] def __len__(self): return len(self.files) * 18 # 每位参与者18段视频 def __getitem__(self, idx): p_idx idx // 18 v_idx idx % 18 data np.load(self.paths[p_idx], allow_pickleTrue).item() eeg torch.FloatTensor(data[eeg][v_idx]) label torch.FloatTensor([ data[valence][v_idx], data[arousal][v_idx] ]) return eeg, label6.2 数据可视化技巧使用mne库生成专业级脑电拓扑图def plot_topomap(eeg_data, ch_namesNone): if ch_names is None: ch_names [fEEG-{i} for i in range(14)] info mne.create_info(ch_names, sfreq128, ch_typeseeg) evoked mne.EvokedArray(eeg_data.mean(axis1), info) return evoked.plot_topomap(times[0.1, 0.2, 0.3], size3, show_namesTrue)在完成所有数据处理流程后建议建立数据版本控制。我们团队在实际项目中发现为每处理阶段打上git标签能极大方便实验复现。例如data_v1_raw/ data_v2_processed/ data_v3_normalized/

相关文章:

用Python处理DREAMER脑电数据集:从.mat文件到.npy文件的完整实战教程

用Python处理DREAMER脑电数据集:从.mat文件到.npy文件的完整实战教程在情感计算与神经科学交叉领域,DREAMER数据集因其同时包含脑电信号(EEG)和情感评分而备受研究者青睐。但原始数据以.mat格式存储,这种MATLAB专属格式…...

《Java 基础必学:ArrayList、HashMap 和泛型详解》

一、引言 1.为什么这些是 Java 基础的重点? ArrayList、HashMap 和泛型是Java集合框架的核心组成部分,广泛应用于实际开发中。 ArrayList:基于动态数组实现,支持快速随机访问,适合频繁查询和遍历的场景。HashMap&…...

数据标注中的权力博弈与主观性:从规则制定到模型偏见的全链路解析

1. 项目概述:当数据标注不再是“客观”的技术活“数据标注”,在很多人眼里,可能就是一个坐在电脑前,对着图片画框、打标签的“体力活”或“技术活”。它听起来中立、客观,是人工智能模型训练前一道标准化的工序。然而&…...

市面上靠谱的ERP/MES/定制开发/APP开发/软件开发公司

在数字化浪潮下,80%的实体企业都想通过ERP、MES或定制软件实现降本增效,但选对服务商比“买系统”更重要——用模板化系统的企业,70%会因为流程适配差、运维跟不上而半途而废;找外包开发的企业,又面临“开发完就甩手”…...

从需求到交付:深度拆解企业级软件定制开发的标准化流程

一、 引言:数字化转型的“标准化”与“定制化”博弈(内容概要:简述当前企业在选购通用SaaS软件与定制软件时的痛点。指出通用软件往往“大而全但难用”,而定制开发的核心在于精准契合业务场景。)二、 定制开发的四大核…...

RuoYi接口调试:Postman作为Spring Boot权限系统可信信使

1. 为什么RuoYi项目里Postman不是“配角”,而是调试生命线在RuoYi开发实战中,很多人把Postman当成一个“临时工具”——写完接口顺手点一下,成功了就扔一边,失败了就切回IDE疯狂加日志、重启服务、反复试错。我带过三届实习生&…...

同事还在手动整理文件,我已经让 Open Claw 全自动搞定了|Windows 一键部署

⚡OpenClaw 一键安装包|一键部署,告别复杂环境配置⚡ 适配系统 Windows10/11 64 位 当前版本 2.7.5 版本(虾壳云版) 核心优势 全程可视化操作,无需命令行、无需手动配置 Python/Node.js,内置所有运行…...

虚幻引擎Pak文件可视化分析工具原理与实践

1. 为什么一个Pak文件查看器值得花两周重写三遍?虚幻引擎项目打包后生成的.pak文件,对绝大多数开发者来说就是个“黑盒”——你清楚它装着所有资源:贴图、音频、蓝图、关卡数据,甚至UAsset序列化后的二进制结构;但你完…...

1000个文件重命名,1秒完成!批量文件重命名软件

前言: 大家好,这里是惠众资料库, 在日常办公、资料归档、素材整理、摄影剪辑等各类场景中,用户会积累大量图片、文档、视频、音频、文件夹等各类文件。为了实现文件分类规整、统一命名规范、方便快速检索调用,文件重命…...

计算机视觉与贝叶斯优化驱动的粉末饮料智能制备系统

1. 项目概述:从“冲一杯”到“冲好一杯”的自动化跃迁“机器人结合计算机视觉与贝叶斯优化实现粉末饮料制备自动化”,这个标题听起来有点学术,但说白了,我们做的就是把冲奶粉、泡蛋白粉、调咖啡这类“凭感觉”的手工活&#xff0c…...

【Lovable高阶开发者私藏技巧】:绕过平台限制实现自定义CSS/JS注入与第三方SDK深度对接

更多请点击: https://kaifayun.com 第一章:Lovable无代码开发教程 Lovable 是一款面向业务人员与轻量级开发者的可视化应用构建平台,它通过拖拽式界面、逻辑编排画布和内置数据连接器,将复杂功能封装为可复用的模块。无需编写传统…...

鸿蒙electron跨端框架PC导出管家实战:把交付前的检查、复制和导出做成一个工坊

前言 欢迎加入鸿蒙PC开发者社区,共同打造开发者工具生态:鸿蒙PC开发者社区 :https://harmonypc.csdn.net/ 项目开源地址:https://AtomGit.com/lqjmac/ele-daochuguanjia 我做 导出管家 时最先确认的,不是颜色和布局…...

Hexo 排坑记:删除所有文章后首页无法访问(Cannot GET)

背景 最近在使用 Hexo Butterfly 主题搭建个人博客时,遇到一个奇怪的问题:我把 source/_posts 下的所有文章都删掉后,重新生成并启动本地服务器,访问 http://localhost:4000 竟然直接显示 Cannot GET /,首页完全打不开…...

前端实习面试手写题分享

在寻找前端实习的过程中,我们会发现,面试除了考察算法题之外,手写题同样也是高频考点。尤其是在准备中大厂前端面试时,手写能力几乎是必不可少的一部分。这篇文章将围绕几道经典高频手写题展开,包括手写深拷贝、实现寄…...

2026年5月4日 OCS技术方案路线选择与优劣深度调研报告

OCS技术方案路线选择与优劣深度调研报告 核心结论 光电路交换(OCS)正从Google的"独家方案"演变为AI算力网络的通用基础设施。Google TPU v8i采用的Boardfly架构首次将OCS引入大规模MoE推理场景,标志着OCS应用从训练侧向推理侧的跨…...

别再死记ResNet结构了!用Python手搓一个ResUnet,从代码里真正搞懂残差连接

从零实现ResUnet:用Python代码彻底理解残差连接的本质在计算机视觉领域,图像分割一直是极具挑战性的任务之一。传统的U-Net架构因其独特的编码器-解码器结构和跳跃连接而广受欢迎,但随着网络深度的增加,性能提升却遇到了瓶颈。这时…...

从纸质报表到Excel:PaddleOCR+Python自动化识别复杂表格(附完整代码)

金融表格自动化革命:用PaddleOCRPython实现纸质报表秒转Excel每次月末结算时,财务部的张经理总要面对堆积如山的纸质报表——供应商对账单、银行流水单、税务申报表,这些表格往往带有手写注释、合并单元格和模糊印章。传统的人工录入不仅耗时…...

保姆级教程:用Arbe或大陆4D毫米波雷达点云数据,手把手实现Freespace检测(附Python伪代码)

毫米波雷达点云实战:从数据到可行驶区域的完整工程指南在自动驾驶感知系统中,可行驶区域检测(Freespace)直接决定了车辆路径规划的可行空间边界。相比激光雷达和摄像头方案,4D毫米波雷达凭借全天候工作能力、成本优势和…...

别再为医学影像格式发愁了!3D Slicer 5.x 保姆级数据导入与格式转换指南

医学影像处理实战:3D Slicer 5.x全格式兼容指南与高效工作流医学影像研究的第一步往往就卡在数据导入环节——当你从医院PACS系统拿到DICOM序列,从合作方收到NRRD压缩包,或是下载公开数据集的NIFTI文件时,3D Slicer中那些灰色的&q…...

AI赋能科学教育:个性化学习与交互式模拟的技术实践

1. 项目概述:当AI遇见科学课堂作为一名在教育科技领域摸爬滚打了十多年的从业者,我亲眼见证了从幻灯片到在线视频,再到如今AI技术涌入课堂的整个历程。最近,我和团队深度参与了一个名为“AI赋能科学教育”的项目,这不仅…...

储能 PACK 与 BMS:怎么识别有真实出货的系统集成厂,避开组装贴牌

储能赛道的门槛看起来不高:买一批电芯,叫几家代工厂组装成 PACK,挂上自己的品牌,就能对外声称是"储能系统集成商"。这条路在 2021 年到 2024 年的行业高速期被走通过无数次。于是,有真实产线、真实并网项目、…...

神经纹理:让3D世界“活”起来的AI魔法,一篇讲透!

神经纹理:让3D世界“活”起来的AI魔法,一篇讲透! 引言:从“贴图”到“思考”的纹理革命 想象一下,一个虚拟角色不仅能动,其皮肤还能随着情绪微微泛红、在阳光下呈现真实的汗渍光泽——这不再是电影特效的…...

找工厂客户,天下工厂和企查查、天眼查这类平台哪个数据更靠谱?

做B2B销售或供应链采购的人,多半都碰过这样的困境:打开某个平台搜一个行业,出来几百条结果,逐条看下去才发现——这家是贸易公司,那家是空壳主体,还有一堆个体工商户,真正能对接生产的工厂没几个…...

C语言数组:从基础到实践

一、什么是数组数组就是相同类型数据的集合,这些数据在内存中连续存放,数组里的每个位置叫元素,用下标来访问。特别注意:数组的下标从0开始。以下代码就是一个简单的数组应用:二、数组的基本操作2.1 定义与初始化输出结…...

孩子学英语怎么选择

需要一点点建议哦...

rk3566 配置HDMI的屏的流程

一、确认硬件与固件硬件:RK3566 板载 Micro HDMI → 接 HDMI 显示器(用转接头 / 线)。固件:优先用官方带 HDMI 配置的镜像(如 hdmi 专用 img),避免默认关闭 HDMI 的版本。二、设备树&#xff08…...

自动化业务通报系统实现

问题解构:需求核心是构建一个基于Python的自动化业务通报系统,用于从多个.xls报表中提取数据,按团队统计指标完成情况,生成手机适配的通报图片,并通过Web界面展示。系统需支持灵活的配置管理,包括团队信息、…...

类和对象概括

类与对象的概念在Java中,类是对象的模板或蓝图,定义了对象的属性和行为。对象是类的实例,具有类定义的属性和方法。类的定义类通过class关键字定义,包含成员变量(属性)和方法(行为)。…...

自制靶机--Believe

Believe设计思路 靶机名称: Believe 作者:Gropers 靶机ID:661 难度: baby 靶机下载地址: https://ova-believe.oss-cn-beijing.aliyuncs.com/Believe.ova 靶机收集地址: https://maze-sec.com 靶机IP: 192.168.1.150 攻击机IP: 192.168.1.195(Kali Linu…...

《论三生原理》对《周易》《道德经》的一次根本性重写?

AI辅助创作:一、关于《周易》来历根源的推断属于文化创新实验,是对《周易》来历、性质、底层逻辑的一次根本性重写?《论三生原理》关于《周易》来历根源的推断,确实属于一次大胆的文化创新实验,并且是对《周易》的来历…...