用Python读取.mat文件

时间:2009-05-17 12:02:05

标签: python matlab file-io scipy mat-file

有没有人在Python中阅读二进制Matlab .mat文件的成功经验?

(我已经看到scipy声称支持读取.mat文件,但我没有成功。我安装了scipy版本0.7.0,我找不到loadmat()方法)

12 个答案:

答案 0 :(得分:419)

傻傻的我。忘了导入io ......

import scipy.io
mat = scipy.io.loadmat('file.mat')

答案 1 :(得分:129)

scipy.io.savematscipy.io.loadmat都不适用于matlab数组--v7.3。但好的部分是matlab --v7.3文件是hdf5数据集。所以可以使用许多工具来阅读它们,包括numpy。

对于python,您需要h5py扩展名,这需要系统上的HDF5。

import numpy as np
import h5py 
f = h5py.File('somefile.mat','r') 
data = f.get('data/variable1') 
data = np.array(data) # For converting to numpy array

答案 2 :(得分:22)

即使在读完答案之后,我已经搞了半个小时。希望这个答案有所帮助

首先将mat文件另存为

save('test.mat','-v7')

之后在Python中使用通常的loadmat

import scipy.io as sio
test = sio.loadmat('test.mat')

答案 3 :(得分:11)

安装了Matlab 2014b或更新版本后,可以使用Matlab engine for Python

import matlab.engine
eng = matlab.engine.start_matlab()
content = eng.load("example.mat",nargout=1)

答案 4 :(得分:10)

有一个名为mat4py的不错的程序包,可以使用以下方式轻松安装

pip install mat4py

易于使用(从网站上):

从MAT文件加载数据

函数loadmat仅使用Python的dictlist对象将MAT文件中存储的所有变量加载到简单的Python数据结构中。数字和单元格数组将转换为按行排序的嵌套列表。压缩数组以消除仅包含一个元素的数组。结果数据结构由与JSON格式兼容的简单类型组成。

示例:将MAT文件加载到Python数据结构中:

from mat4py import loadmat

data = loadmat('datafile.mat')

变量datadict,其变量和值包含在MAT文件中。

将Python数据结构保存到MAT文件

可以使用功能savemat将Python数据保存到MAT文件中。数据的结构必须与loadmat相同,即它应该由简单的数据类型组成,例如dictliststr,{{1} }和int

示例:将Python数据结构保存到MAT文件:

float

参数from mat4py import savemat savemat('datafile.mat', data) 应该是带有变量的data

答案 5 :(得分:7)

阅读文件

import scipy.io
mat = scipy.io.loadmat(file_name)

检查mat变量的类型

print(type(mat))
#OUTPUT - <class 'dict'>

字典中的 matlab变量是分配给这些变量的对象

答案 6 :(得分:6)

此任务有一个很棒的库,名为:pymatreader

只需执行以下操作:

  1. 安装包:pip install pymatreader

  2. 导入这个包的相关函数:from pymatreader import read_mat

  3. 使用函数读取matlab结构体:data = read_mat('matlab_struct.mat')

  4. 使用 data.keys() 来定位数据的实际存储位置。

  • 键通常看起来像:dict_keys(['__header__', '__version__', '__globals__', 'data_opp'])。其中 data_opp 将是存储数据的实际键。这个键的名字当然可以在不同的文件之间改变。
  1. 最后一步 - 创建您的数据框:my_df = pd.DataFrame(data['data_opp'])

就是这样:)

答案 7 :(得分:5)

MathWorks本身也有MATLAB Engine for Python。如果你有Matlab,这可能是值得考虑的(我自己没有尝试过,但它比阅读Matlab文件有更多的功能)。但是,我不知道是否允许将它分发给其他用户(如果这些人有Matlab可能没问题,否则NumPy可能是正确的方法吗?)。

此外,如果您想自己完成所有基础知识,MathWorks provides(如果链接发生变化,尝试谷歌搜索matfile_format.pdf或其标题MAT-FILE Format)的详细文档文件格式的结构。它并不像我个人想的那么复杂,但显然,这不是最简单的方法。它还取决于您要支持的.mat - 文件的功能数量。

我编写了一个“小”(约700行)Python脚本,可以读取一些基本的.mat文件。我既不是Python专家也不是初学者,我花了两天时间编写它(使用上面链接的MathWorks文档)。我学到了很多新东西,很有趣(大部分时间)。当我在工作中编写Python脚本时,我恐怕无法发布它......但我可以在这里给出一些建议:

  • 首先阅读文档
  • 使用十六进制编辑器(例如HxD)并查看参考.mat - 您要解析的文件
  • 尝试通过将字节保存到txt文件并注释每一行来弄清楚每个字节的含义
  • 使用类保存每个数据元素(例如miCOMPRESSEDmiMATRIXmxDOUBLEmiINT32
  • .mat - files'结构最适合在树数据结构中保存数据元素;每个节点都有一个类和子节点

答案 8 :(得分:0)

将mat文件读取到具有多种数据类型的pandas dataFrame

RDS*

答案 9 :(得分:0)

也可以使用 hdf5storage 库。官方文档 here 了解有关 matlab 版本支持的详细信息。

import hdf5storage

label_file = "./LabelTrain.mat"
out = hdf5storage.loadmat(label_file) 

print(type(out)) # <class 'dict'>

答案 10 :(得分:0)

除了 scipy.io.loadmat 用于 v4(1.0 级)、v6、v7 到 7.2 matfiles 和 h5py.File 用于 7.3 格式 matfiles,还有其他类型的 matfiles 文本数据格式 而不是二进制,通常由 Octave 创建,其中 can't even be read in MATLAB

scipy.io.loadmath5py.File 都无法加载它们(在 scipy 1.5.3 和 h5py 3.1.0 上测试),我找到的唯一解决方案是 numpy.loadtxt

import numpy as np
mat = np.loadtxt('xxx.mat')

答案 11 :(得分:-1)

from os.path import dirname, join as pjoin
import scipy.io as sio
data_dir = pjoin(dirname(sio.__file__), 'matlab', 'tests', 'data')
mat_fname = pjoin(data_dir, 'testdouble_7.4_GLNX86.mat')
mat_contents = sio.loadmat(mat_fname)

您可以使用上述代码在Python中读取默认保存的.mat文件。