用python读写.mat文件——使用scipy库的scipy.io和h5py库

2023-10-31

python 中的scipy库和h5py库

1 读.mat文件:

1.1 用scipy.io读取

在用python处理matlab的mat文件时,发现数据量较小的文件可以直接通过scipy库的scipy.io读取:

import scipy.io as scio 
data = scio.loadmat(path)

通过type(data)可以看到,读取出来的data是字典类型。由于最近在做ECG(心电图)和EEG(脑电图),原始信号均以.mat文件储存。所以这里的data就以一段ECG信号为例(大小为30M),用print大法一探究竟:

print('data:\n',data)     		    #大致看一下data的结构
print('datatype:\n',type(data)) 	#看一下data的类型
print('keys:\n',data.keys)  		#查看data的键,这里验证一下是否需要加括号
print('keys:\n',data.keys())		#当然也可以用data.values查看值
print(data['EKG'])      		    #查看数据集
print('target shape\n',data['EKG'].shape)

输出结果:

data:
{'__header__': b'MATLAB 5.0 MAT-file, Platform: PCWIN64, Created on: Wed Feb 19 20:44:08 2020', 
'__version__': '1.0', '__globals__': [], 
'EKG': array([[0.],
       [0.],
       [0.],
       ...,
       [0.],
       [0.],
       [0.]])}

datatype:
 <class 'dict'>

keys:
 <built-in method keys of dict object at 0x000001F1B0791EA8>

keys:
 dict_keys(['__header__', '__version__', '__globals__', 'EKG'])

[[0.]
 [0.]
 [0.]
 ...
 [0.]
 [0.]
 [0.]]

target shape 
(8642000, 1)

上面的输出结果可以看到,原始的EKG信号是以列保存的。若要转换成行,我的做法是结合强大的numpy进行转置(data[‘ECG’].T),处理的效率很高。

所以如果需要用python提取原始信号,只要知道变量的名字,就可以通过键-值对的方式索引得到。其他数据信息做法相同。

1.2 用h5py库读取

这里尝试读取一个比较大的文件(1G多),包含111人的EEG信号(signal),每个人的数字代号,以及各信号所属的睡眠时期(labels),用h5py.File读取:

import h5py
data = h5py.File()

查看一下类型等信息:

print('data\n',data)
print('datatype\n',type(data))
print('keys\n',data.keys())
print(data['ipeo'])
print(data['labels'])
print(data['signal'])

输出结果:

data
 <HDF5 file "DeepLearn_all_4.mat" (mode r+)>

datatype
 <class 'h5py._hl.files.File'>

keys
 <KeysViewHDF5 ['ipeo', 'labels', 'signal']>

<HDF5 dataset "ipeo": shape (97014, 1), type "<f8">
<HDF5 dataset "labels": shape (97014, 1), type "<f8">
<HDF5 dataset "signal": shape (3750, 97014), type "<f8">

可以看到,data中的3个k键,以dataset储存数据。111人的数据加起来总共有97014条信息,通常来说应该是按行表示的,在matlab中也确实是按行来表示,像变量ipeo,labels都是一维向量,而signal则是97014 × 3750 的矩阵。而用h5py读取出来,就自动转置了(这里我理解成进行了一次压缩),所以如果读取后要对其做相应的处理,则需要再转置回来,用numpy高效且简洁:

signal = np.array(load_data["signal"],dtype ='<f8').T
labels = np.array(load_data["labels"],dtype ='uint8').T[0]
ipeo = np.array(load_data["ipeo"],dtype ='uint8').T[0]

因为labels和ipeo转置后,数据储存于两层列表中,所以选外层列表的第0项,以去掉外层列表。

1.3 小节

在读取.mat文件时,我发现h5py库是和scipy.io互补的。当.mat文件比较大,或是在matlab储存的方法不同时,尝试用scipy.io读取会报错,这时用h5py通常可以读取成功。反之,如果用h5py能成功读取的文件(通常比较大),则用scipy.io无法读取成功。

ps:目前遇到的情况就是这样的耐人寻味,可能和电脑的内存有关。具体原因,以后慢慢研究

2 写.mat

2.1 用scipy.io写入

这里用到了scio的savemat方法:

import scipy.io as scio 

scio.savemat(save_path,{'EKG':split_EKG}) 

一般情况下的写入,对scio.savemat传入两个参数:保存路径,要保存的变量就可以保存了。要保存的变量同样是以字典的形式传入的,可以用键-值对的形式传入多个变量。

2.2 用h5py写入

原本尝试了用h5py创建数据集,并保存的方法:

h5file = h5py.File(save_path,'w')
h5file.create_dataset('labels', data=labels)
h5file.create_dataset('signal', data=signal)
h5file.close()

之后发现用matlab无法打开,报错显示没有用二进制写入。因为如果只是’w’的话,h5file写入的是.h5文件而非.mat文件。所以试着将第一行改写为:

h5f = h5py.File(save_path,'wb')

保存说只能是’r’,‘w’,'a’这种,不能以二进制写。所以就先保存成.h5文件,即,将save_path中的文件后缀写成.h5,然后用matlab对.h5处理,转成.mat文件。

这里参照这篇博文:用matlab处理.h5尾缀的数据集并转化为.mat(.h5转.mat)
因为之前读取后对数据进行了一次转置,所以在后面用matlab读取h5文件时,会发现数据是又被转置过的,应该是保存的时候自动进行的转置。对于matlab,需要在变量后加" ’ "号重新转置。

最后附上h5文件的简介:h5文件简介

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用python读写.mat文件——使用scipy库的scipy.io和h5py库 的相关文章

  • 理解RoIAlign实际操作

    我们的模型取一个大小为 512x512x3 宽度x高度x RGB 的图像输入 VGG16将其映射为一个 16x16x512的feature map 比例因子是 32 接下来 我们将使用其中一个proposed RoIs 145x200box
  • C++构造函数/析构函数 设置成private的原因

    将构造函数 析构函数声明为私有和保护的 那么对象如何创建 已经不能从外部调用构造函数了 但是对象必须被构造 应该如何解决 麻烦大家帮忙说明 关于构造 析构函数声明为私有和保护时的用法 提出这个问题 说明你已经对c 有所思考了 从语法上来讲
  • C++多线程之std::thread

    C 11 包含头文件 thread h 并使用命名空间std thread类提供的方法 方法 描述 thread 构造函数 在这里传入线程执行函数 和函数参数 get id 返回std thread id 这是一个类 可以间接得到unsig
  • 在centos7下docker 制作 java8镜像,上传到阿里云镜像仓库

    一 本地制作镜像 1 拉取centos4基础镜像 docker pull centos 7 创建目录 后面都在这个目录下操作 mkdir usr local docker app java projects java8 cd usr loc
  • vue 前端数据进行 RSA 加密、解密、签名、验签

    未整理完 关于加密 base64 加密是属于双向加密 就是加密后可以解密回来 MD5 是单向加密 就是加密后无法解密 MD5 加盐加密就是将 用户名 密码 进行MD5加密 类似都叫加盐 这里用户名就是盐值 支付宝的公钥私钥加密 公钥解密私钥
  • Intel Corporation SSD 750 Series 性能测试

    作者 QQ群 852283276 微信 arm80x86 微信公众号 青儿创客基地 B站 主页 https space bilibili com 208826118 机器 j2 j2 pc uname a Linux j2 pc 4 13
  • 【“码”上有你】智能合约库有奖征码第3期来袭

    智能合约库有奖征码 活动开展以来 伙伴们群策群力踊跃贡献 帮助夯实了合约库的基础功能 涌现了诸如共享经济 商品溯源等更多面向实际业务场景的合约样板 使得合约库更加满足开发者和行业多样化的诉求 为了让更多开发者参与到智能合约库组件优化中 拓展
  • 解析xml第二子节点

    import org w3c dom Document import org w3c dom Element import org w3c dom Node import org w3c dom NodeList import org xm
  • Linux下addr2line命令用法

    Linux下addr2line命令用于将程序指令地址转换为所对应的函数名 以及函数所在的源文件名和行号 当含有调试信息 g 的执行程序出现crash时 core dumped 可使用addr2line命令快速定位出错的位置 如果无法确定文件
  • 【1day】复现时空智友企业流程化管控系统文件上传漏洞

    注 该文章来自作者日常学习笔记 请勿利用文章内的相关技术从事非法测试 如因此产生的一切不良后果与作者无关 目录 一 漏洞描述 二 影响版本 三 资产测绘 四 漏洞复现 一 漏洞描
  • 构建面向未来的前端架构

    To build a house you need to put one brick on top of another 不积跬步无以至千里 大家好 我是柒八九 今天 我们来讲讲在 前端架构 要想在大项目中做到构建性能良好并且在架构方面具有
  • Hello Spring Cloud Alibaba(八)之使用spring security oAuth2

    Hello Spring Cloud Alibaba 八 之使用spring security oAuth2 oAuth2介绍 什么是 oAuth 什么是 Spring Security 认证服务器 导入包 配置文件 配置类 资源服务器 导
  • SQL关系代数——除法

    如何理解关系中的除法 定义 设关系 R除以关系S的结果为关系T 则T包含所有在R中但不在S中的属性及其值 且T的元组与S的元组的所有组合都在R 中 设有关系R S以及RS 如图所示 求RS S的结果 很容易求得结果为 张三 所以你很容易看出
  • 初入android驱动开发之字符设备(一)

    大学毕业 初入公司 招进去的是android驱动开发工程师的岗位 那时候刚进去 首先学到的就是如何搭建kernel android的编译环境 然后就是了解如何刷设备以及一些最基本的工具 如adb fastboot grep minicom
  • Jenkins学习笔记4

    配置构建流程 Jenkins任务创建 1 创建新任务 把这个Accept first connection改成 No Validation 问题得到解决 说明下 要确认下主分支的名称是master还是main 构建触发器这块暂时没有需要配置
  • debian安装dde桌面

    使用命令 sudo vi etc apt sources list d deepin git list添加以下内容 deb trusted yes arch amd64 https deepin community github io de
  • Jmap-JVM(十六)

    上篇文章说了ZGC是jdk11加入的 他是未来jvm垃圾收集器的奠定者 满足TB级别内存处理 STW时间保持在10ms以下 Jmap 我们可以先通过jmap histo 进程ip 来查看 但是这样看不太清晰 我们可以用这行命令生成一个文件
  • 理解 Pod 和容器设计模式

    本节课程要点 为什么需要 Pod Pod 的实现机制 详解容器设计模式 为什么需要 Pod 容器的基本概念 现在来看第一个问题 为什么需要 Pod 我们知道 Pod 是 Kubernetes 项目里面一个非常重要的概念 也是非常重要的一个原
  • 傅里叶分析——三角函数

    一 嘛叫频域 从我们出生 我们看到的世界都以时间贯穿 股票的走势 人的身高 汽车的轨迹都会随着时间发生改变 这种以时间作为参照来观察动态世界的方法我们称其为时域分析 而我们也想当然的认为 世间万物都在随着时间不停的改变 并且永远不会静止下来
  • synchronized锁升级详细过程

    目录 一 锁升级基础 1 偏向锁 2 轻量级锁 自旋锁 3 重量级锁 二 为什么要有锁升级过程 1 减少无竞争情况下的同步操作开销 2 尽量避免线程切换的开销 3 降低内存消耗 4 提高系统吞吐量 三 锁升级具体过程 一 锁升级基础 1 偏

随机推荐

  • 流程挖掘为什么已成为RPA智能自动化重要组成部分?

    流程挖掘为什么已成为RPA智能自动化重要组成部分 近年来 越来越多企业正通过部署RPA优化业务流程 保持企业的竞争优势 IDC调查发现 受调查的用户中 201家企业 35 表示 正在使用IPA中的流程挖掘功能 未来12 24个月内将有39
  • Windows下查看进程的命令行参数

    我们可以使用下面方法得到 在XP下是可以查看进程命令行参数的 使用下面的命令 wmic process get caption commandline value 如果想查询某一个进程的命令行参数 使用下列方式 wmic process w
  • no session found for current thread错误详解

    hibernate4与spring3整合时遇到no session found for current thread错误 在网上找了好多都说加上
  • three.js学习(第四天)之环境遮挡贴图与强度

    AO环境遮挡贴图 创建纹理 const textureLoader new THREE TextureLoader const doorColorTexture textureLoader load src assets textures
  • geth运行报错zsh: exec format error: ./geth

    使用 file geth 可知 原因多半是geth与对应的系统不匹配造成的 同理 AMD的mac也暂时用不了这个 可以从这里重新下载 https geth ethereum org downloads
  • Python virtualenv 虚拟环境(详细使用,包含打包 exe/app )

    一 简介 virtualenv 官网 Python 虚拟环境官方中文文档 在开发 Python 应用程序的时候 系统上通常只会安装一个 Python 版本 例如 3 7 所有使用 pip 安装的第三方包都会被安装到 Python 的 sit
  • 期货量化交易程序CTP入门指南 一

    周末综合征 周末爬山 跑步导致周一上班困的啥都不想做 正好趁这个时间写一下前两周做的一个期货网格化工具 算是给后面要入门的兄弟尽点微薄之力 虽然网上的资料已经足够多 我本对期货一无所知 仅知道 期货 二字而已 但受朋友之托开发一款网格化工具
  • 快速使用C ++保护或取消保护Word文档

    数字文档的保护一直是热门话题 就Word文档而言 MS Word提供了多种内容保护功能 这些功能限制了用户对文档的访问 您可以使用密码保护文档并应用所需的限制 以避免未经授权的访问 因此 本文将介绍如何在C 应用程序中自动执行Word文档保
  • python作业合集(三)

    作业1 猜数字游戏 电脑随机一个范围内的数 用户输入数据判断 如果数大了 提供 数大了 成功之后 加上用户是否继续功能 作业2 猜拳游戏 石头 剪刀 布的游戏 作业3
  • git设置编码

    git config global core quotepath false 显示 status 编 git config global gui encoding utf 8 图形界面编码 git config global i18n co
  • 你好,五月

    五月算是上大学以来最忙碌的一个月 因为所有事碰巧都堆到这个月了 当然也是因为这个月的存在 让我成长了许多也让我认识到原来自己可以做这么多事 人力项目 柳暗花明 人力资源项目 五一七天时间我们全天基本上是在423度过的 每天都一起在研究如何实
  • macOS查看文件路径

    当在mac系统中需要输入文件路径 快速找到文件路径 有以下2个步骤 1 点击Finder查看全部文件 shift command c 进入到磁盘界面找到需要放置的文件夹 2 打开终端输入命令 defaults write com apple
  • Ubuntu 安装 Wireshark

    Ubuntu 安装 Wireshark 概述 Wireshark 是一款图形化的网络协议分析工具 它允许你交互式地浏览实时网络或以前保存的捕获文件中的数据包数据 Wireshark 的本地捕获文件格式是 pcapng 格式 或者是 pcap
  • jsunix时间戳转换成时间

    jsunix时间戳转换成时间 js实现unix时间戳转换代码教程如下 输入一个时间 实现结果 转换成时间戳 js实现代码如下 act 鏃堕棿鎴宠浆鎹 version 1 1 author youngxj date 2018 07 01 ur
  • 训练---递归与递推

    文章目录 一 递归实现指数型枚举 递归 二 递归实现排列型枚举 递归 三 简单斐波那契 四 费解的开关 五 递归实现组合型枚举 六 带分数 七 飞行员兄弟 七 翻硬币 一 递归实现指数型枚举 递归 任意门 include
  • C语言输入输出函数printf与scanf的用法格式

    转自 微点阅读 https www weidianyuedu com content 4617732110906 html c语言输入输出函数printf与scanf的用法格式 printf 函数用来向标准输出设备 屏幕 写数据 scanf
  • 关于nginx服务关闭之后端口占用kill不掉的问题

    这里写自定义目录标题 首先介绍下当前环境 首先介绍下当前环境 nginx版本 1 21 6 linux版本 CentOS8 使用命令行 ps ef grep nginx 查询出当前 nginx进程 使用kill 9 进程号 来进行强制关闭n
  • Activiti和tk.mybatis的坑

    近期开发关于工作流的项目 遇到一个很坑的问题 activiti和tk mybatis居然会有冲突 先看异常 报错的原因大概就算这句话 Parameter 1 of method springProcessEngineConfiguratio
  • KubeVela 再升级:交付管理一体化的云原生应用平台

    11月3日 2022 杭州 云栖大会上 阿里云智能云原生应用平台总经理丁宇宣布 KubeVela 面向四大核心方向能力升级 打造交付管理一体化的云原生应用平台 本次升级是 KubeVela 从应用交付到应用管理不断量变形成的一次质变 同时也
  • 用python读写.mat文件——使用scipy库的scipy.io和h5py库

    python 中的scipy库和h5py库 1 读 mat文件 1 1 用scipy io读取 在用python处理matlab的mat文件时 发现数据量较小的文件可以直接通过scipy库的scipy io读取 import scipy i