用Python读取.mat文件

Gil*_*aor 344 python file-io matlab scipy mat-file

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

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

Gil*_*aor 460

傻我.忘了导入io ...

import scipy.io
mat = scipy.io.loadmat('file.mat')
Run Code Online (Sandbox Code Playgroud)

  • scipy不支持v7.3 mat文件(参见注释[here](http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.io.loadmat.html)).有关解决方案,请参阅[vikrantt的回答](http://stackoverflow.com/a/19340117/674976). (16认同)
  • 例如`save('myfile.mat',' - v7')` (5认同)
  • 官方SciPy.io教程:http://docs.scipy.org/doc/scipy/reference/tutorial/io.html (4认同)
  • 更新了 SciPy.io 教程的链接 https://docs.scipy.org/doc/scipy/tutorial/io.html @FranckDernoncourt (2认同)

vik*_*ntt 137

既不是scipy.io.savemat,也不scipy.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 a NumPy array
Run Code Online (Sandbox Code Playgroud)

  • 如果在保存数据时在Matlab中使用'-v7.3'标志,这样可以正常工作.使用默认的"save"(至少在Matlab R2014b中)会导致无法使用上述技术读取的文件.如果使用'-v7.3'标志,则可以正确读取数值数据. (5认同)
  • 你能解释一下你的例子中_f_和_data_之间的关系吗?如何将_f_移动到numpy数组? (4认同)
  • @devSpartan `f.keys()` 将向您显示您可以访问的内容 (3认同)
  • 是的,这就是我在帖子中所说的.在Matlab中保存时需要使用-v7.3.无论如何,您应该这样做,因为它使用更好/更受支持/标准化的格式. (2认同)
  • 我怎么知道它包含 data/variable1 下的数据? (2认同)

Bha*_*ngh 22

看完答案后,我已经搞了半个小时.希望这个答案有所帮助

首先将mat文件保存为

save('test.mat', '-v7')
Run Code Online (Sandbox Code Playgroud)

之后在Python中使用通常的loadmat

import scipy.io as sio
test = sio.loadmat('test.mat')
Run Code Online (Sandbox Code Playgroud)


Cle*_*leb 15

有一个很好的包mat4py,可以轻松安装使用

pip install mat4py
Run Code Online (Sandbox Code Playgroud)

它很简单(来自网站):

从MAT文件加载数据

该函数loadmat只使用Python dictlist对象将存储在MAT文件中的所有变量加载到一个简单的Python数据结构中.数字和单元格数组将转换为行排序的嵌套列表.挤压数组以消除只有一个元素的数组.生成的数据结构由与data格式兼容的简单类型组成.

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

from mat4py import loadmat

data = loadmat('datafile.mat')
Run Code Online (Sandbox Code Playgroud)

变量dictsavemat包含在MAT文件中的变量和值的变量.

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

可以使用该函数将Python数据保存到MAT文件中loadmat.数据在以同样的方式构建为dict,也就是说,它应该由简单数据类型,像list,str,int,floatdata.

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

from mat4py import savemat

savemat('datafile.mat', data)
Run Code Online (Sandbox Code Playgroud)

参数dict应为mat4py变量a.


Dan*_*iel 11

安装Matlab 2014b或更新版本后,可以使用PythonMatlab引擎:

import matlab.engine
eng = matlab.engine.start_matlab()
content = eng.load("example.mat", nargout=1)
Run Code Online (Sandbox Code Playgroud)

  • 尝试此答案时出现错误?奇怪的是,它不使用pylab。 (3认同)

Dak*_*ksh 10

读取文件

import scipy.io
mat = scipy.io.loadmat(file_name)
Run Code Online (Sandbox Code Playgroud)

检查mat变量的类型

print(type(mat))
#OUTPUT - <class 'dict'>
Run Code Online (Sandbox Code Playgroud)

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


moz*_*ozz 6

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

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

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

  • 首先阅读文档
  • 使用HEX-Editor(例如HxD)并查看.mat要解析的引用文件
  • 尝试通过将字节保存到txt文件并注释每一行来弄清楚每个字节的含义
  • 使用类来保存每个数据元素(如miCOMPRESSED,miMATRIX,mxDOUBLEmiINT32)
  • .mat-files'结构是最佳的用于保存在一个树形数据结构中的数据元素; 每个节点都有一个类和子节点

  • 这是mathworks提供的某种疯狂的文档.40页解释格式,没有提到它是HDF5的子集. (8认同)

BER*_*RKO 6

使用混合数据类型将 mat 文件读取到 Pandas dataFrame

import scipy.io as sio
mat=sio.loadmat('file.mat')# load mat-file
mdata = mat['myVar']  # variable in mat file 
ndata = {n: mdata[n][0,0] for n in mdata.dtype.names}
Columns = [n for n, v in ndata.items() if v.size == 1]
d=dict((c, ndata[c][0]) for c in Columns)
df=pd.DataFrame.from_dict(d)
display(df)
Run Code Online (Sandbox Code Playgroud)


Ofi*_*rer 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'])

就是这样 :)


小智 5

除了scipy.io.loadmatv4(1.0 级)、v6、v7 到 7.2 matfile 和 h5py.File7.3 格式 matfile 之外,还有另一种类型的文本数据格式而不是二进制 matfile,通常由Octave创建,甚至无法在 MATLAB 中读取

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

import numpy as np
mat = np.loadtxt('xxx.mat')
Run Code Online (Sandbox Code Playgroud)