是否可以在Python中读取二进制MATLAB .mat文件?
我看到SciPy声称支持读取.mat文件,但我没有成功。我安装了SciPy 0.7.0版本,但找不到loadmat()方法。
是否可以在Python中读取二进制MATLAB .mat文件?
我看到SciPy声称支持读取.mat文件,但我没有成功。我安装了SciPy 0.7.0版本,但找不到loadmat()方法。
当前回答
既不scipy.io。savemat,或scipy.io.loadmat适用于MATLAB数组版本7.3。但好的部分是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
其他回答
除了v4 (Level 1.0), v6, v7到7.2 matfiles和h5py. io.loadmat之外。文件7.3格式matfiles,有另一种类型的matfiles在文本数据格式而不是二进制,通常由Octave创建,这甚至不能在MATLAB中读取。
scipy.io.loadmat和h5py。文件不能加载它们(在scipy 1.5.3和h5py 3.1.0上测试),我找到的唯一解决方案是numpy.loadtxt。
import numpy as np
mat = np.loadtxt('xxx.mat')
还有MathWorks本身的Python MATLAB引擎。如果你有MATLAB,这可能值得考虑(我自己没有尝试过,但它有很多功能,而不仅仅是读取MATLAB文件)。然而,我不知道是否允许将其分发给其他用户(如果这些人拥有MATLAB,这可能不是问题。否则,也许NumPy才是正确的选择?)
此外,如果您想自己完成所有的基础工作,MathWorks提供了关于文件格式结构的详细文档(如果链接更改,请尝试谷歌获取matfile_format.pdf或其标题MAT-FILE Format)。这并不像我个人想的那么复杂,但显然,这不是最简单的方法。这也取决于你想要支持多少个.mat文件的特性。
我写了一个“小”(大约700行)的Python脚本,它可以读取一些基本的.mat文件。我既不是Python专家,也不是初学者,我花了大约两天时间来编写它(使用上面链接的MathWorks文档)。我学到了很多新东西,而且很有趣(大部分时间)。由于Python脚本是我在工作中编写的,恐怕我不能发布它…但我可以在这里给出一些建议:
首先阅读文档。 使用十六进制编辑器(如HxD)并查看您想要解析的引用.mat文件。 通过将字节保存到.txt文件中并注释每行来尝试找出每个字节的含义。 使用类保存每个数据元素(如miCOMPRESSED、miMATRIX、mxDOUBLE或miINT32) .mat-files的结构是保存树形数据结构中的数据元素的最佳结构;每个节点有一个类和一个子节点
也可以使用hdf5storage库。关于matlab版本支持的详细信息,这里是官方文档。
import hdf5storage
label_file = "./LabelTrain.mat"
out = hdf5storage.loadmat(label_file)
print(type(out)) # <class 'dict'>
安装了MATLAB 2014b或更新版本后,可以使用MATLAB for Python引擎:
import matlab.engine
eng = matlab.engine.start_matlab()
content = eng.load("example.mat", nargout=1)
有一个用于此任务的很棒的库: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'])
就是这样:)