是否可以在 Python 中读取二进制 MATLAB .mat 文件?

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

有帮助吗?

解决方案

需要一个进口,import scipy.io ...

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

其他提示

无论scipy.io.savemat,也不是为MATLAB阵列版本7.3 scipy.io.loadmat工作。但很大一部分是MATLAB 7.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

首先保存.MAT文件:

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

在此之后,在Python,使用通常的loadmat功能:

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

有一个很好的封装称为 mat4py 它可以很容易使用安装

pip install mat4py

有直接使用(从网站):

<强>从MAT文件加载数据

该函数loadmat加载存储在MAT-文件到一个简单的Python数据结构,仅使用Python的dictlist对象的所有变量。数字和单元阵列被转换为行排序的嵌套列表。阵列被挤压,以消除阵列只有一个元素。将得到的数据结构是由简单类型,可与 JSON 格式兼容的

例:加载MAT文件转换为Python数据结构:

from mat4py import loadmat

data = loadmat('datafile.mat')

变量data是与包含在MAT-文件中的变量和值的dict

保存一个Python数据结构MAT文件

Python数据可以保存到MAT文件,用函数savemat。数据具有相同的方式,作为loadmat被结构化的,即,它应当由简单的数据类型,如dictliststrint,和float

例:保存一个Python数据结构MAT文件:

from mat4py import savemat

savemat('datafile.mat', data)

参数data应与变量dict

具有安装在MATLAB 2014B或更新,所述 MATLAB引擎蟒可以使用:

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

<强>读取文件

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

<强>检查MAT变量的类型

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

字典内是的 MATLAB变量,然后在是分配给这些变量的物体

还有 用于 Python 的 MATLAB 引擎 由 MathWorks 本身提供。如果您有 MATLAB,这可能值得考虑(我自己没有尝试过,但它比仅仅读取 MATLAB 文件有更多的功能)。但是,我不知道是否允许将其分发给其他用户(如果这些人拥有 MATLAB,这可能不是问题。否则,也许 NumPy 是正确的选择?)。

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

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

  • 首先阅读文档。
  • 使用十六进制编辑器(例如 高×深)并查看参考文献 .mat- 你想要解析的文件。
  • 通过将字节保存到 .txt 文件并注释每一行来尝试弄清楚每个字节的含义。
  • 使用类来保存每个数据元素(例如 miCOMPRESSED, miMATRIX, mxDOUBLE, , 或者 miINT32)
  • .mat-文件的结构最适合将数据元素保存在树形数据结构中;每个节点有一个类和子节点
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top