在 Python 中读取 .mat 文件
题
是否可以在 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的dict
和list
对象的所有变量。数字和单元阵列被转换为行排序的嵌套列表。阵列被挤压,以消除阵列只有一个元素。将得到的数据结构是由简单类型,可与 JSON 格式兼容的
例:加载MAT文件转换为Python数据结构:
from mat4py import loadmat
data = loadmat('datafile.mat')
变量data
是与包含在MAT-文件中的变量和值的dict
。
保存一个Python数据结构MAT文件强>
Python数据可以保存到MAT文件,用函数savemat
。数据具有相同的方式,作为loadmat
被结构化的,即,它应当由简单的数据类型,如dict
,list
,str
,int
,和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
-文件的结构最适合将数据元素保存在树形数据结构中;每个节点有一个类和子节点