有没有人在Python中阅读二进制Matlab .mat文件的成功经验?
(我已经看到scipy
声称支持读取.mat文件,但我没有成功。我安装了scipy
版本0.7.0,我找不到loadmat()
方法)
答案 0 :(得分:419)
import scipy.io
mat = scipy.io.loadmat('file.mat')
答案 1 :(得分:129)
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 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的dict
和list
对象将MAT文件中存储的所有变量加载到简单的Python数据结构中。数字和单元格数组将转换为按行排序的嵌套列表。压缩数组以消除仅包含一个元素的数组。结果数据结构由与JSON
格式兼容的简单类型组成。
示例:将MAT文件加载到Python数据结构中:
from mat4py import loadmat
data = loadmat('datafile.mat')
变量data
是dict
,其变量和值包含在MAT文件中。
将Python数据结构保存到MAT文件
可以使用功能savemat
将Python数据保存到MAT文件中。数据的结构必须与loadmat
相同,即它应该由简单的数据类型组成,例如dict
,list
,str
,{{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
。
只需执行以下操作:
安装包:pip install pymatreader
导入这个包的相关函数:from pymatreader import read_mat
使用函数读取matlab结构体:data = read_mat('matlab_struct.mat')
使用 data.keys()
来定位数据的实际存储位置。
dict_keys(['__header__', '__version__', '__globals__', 'data_opp'])
。其中 data_opp
将是存储数据的实际键。这个键的名字当然可以在不同的文件之间改变。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脚本时,我恐怕无法发布它......但我可以在这里给出一些建议:
.mat
- 您要解析的文件miCOMPRESSED
,miMATRIX
,mxDOUBLE
或miINT32
).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.loadmat
和 h5py.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文件。