在Python中读取.mat文件

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

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

624669 次浏览

需要导入,import scipy.io

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

scipy.io.savematscipy.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

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

另外,如果你想自己做所有的基础工作,MathWorks提供(如果链接改变,尝试谷歌为matfile_format.pdf或其标题MAT-FILE Format)是关于文件格式结构的详细文档。这并不像我个人想的那么复杂,但显然,这不是最简单的方法。这也取决于你想要支持多少.mat-files的特性。

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

  • 首先阅读文档。
  • 使用十六进制编辑器(例如HxD)并查看你想要解析的引用__abc0文件。
  • 通过将字节保存到.txt文件中并注释每行来尝试找出每个字节的含义。
  • 使用类保存每个数据元素(如miCOMPRESSEDmiMATRIXmxDOUBLE,或miINT32)
  • .mat-files的结构是保存树形数据结构中的数据元素的最佳结构;每个节点有一个类和一个子节点

安装了MATLAB 2014b或更新版本后,可以使用Python的MATLAB引擎:

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

首先将.mat文件保存为:

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

之后,在Python中,使用常见的loadmat函数:

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

读取文件

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

检查MAT变量的类型

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

字典中的MATLAB变量是赋值给这些变量的对象。

有一个很好的包叫做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数据可以通过savemat函数保存到mat文件中。数据的结构必须与loadmat相同,即它应该由简单的数据类型组成,如dictliststrintfloat

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

from mat4py import savemat


savemat('datafile.mat', data)

参数data应该是包含变量的dict

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文件。

将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)

这个任务有一个很棒的库,名为: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'])

就是这样:)

也可以使用hdf5storage库。官方文档在这里关于matlab版本支持的细节。

import hdf5storage


label_file = "./LabelTrain.mat"
out = hdf5storage.loadmat(label_file)


print(type(out)) # <class 'dict'>

除了v4(1.0级别)、v6、v7到7.2格式matfiles的scipy.io.loadmat和7.3格式matfiles的h5py.File之外,在文本数据格式中还有另一种类型的matfiles,而不是二进制,通常由倍频程创建,它甚至不能在MATLAB中读取. 7。

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

import numpy as np
mat = np.loadtxt('xxx.mat')

scipy将完美地加载.mat文件。 我们可以使用get()函数将其转换为numpy数组

mat = scipy.io.loadmat('point05m_matrix.mat')


x = mat.get("matrix")
print(type(x))
print(len(x))


plt.imshow(x, extent=[0,60,0,55], aspect='auto')
plt.show()

在我自己解决了这个问题并尝试了其他库(我不得不说mat4py也是一个很好的库,但有一些限制)之后,我建立了这个库(&;__abc0 &;),可以处理大多数变量类型,对我来说最重要的是&;字符串&;类型。.mat文件需要保存在-V7.3版本中。我希望这对社区有用。

安装:

pip install matdata2py

如何使用这个库:

import matdata2py as mtp

加载Matlab数据文件:

Variables_output = mtp.loadmatfile(file_Name, StructsExportLikeMatlab = True, ExportVar2PyEnv = False)
print(Variables_output.keys()) # with ExportVar2PyEnv = False the variables are as elements of the Variables_output dictionary.

使用ExportVar2PyEnv = True,你可以分别看到每个变量作为与Mat文件中保存的同名的python变量。

国旗的描述

StructsExportLikeMatlab = True/False结构导出为字典格式(False)或类似于Matlab的基于点的格式(True)

ExportVar2PyEnv = True/False将单个字典中的所有变量导出(True)或作为单独的单独变量导出到python环境中(False)

在python中上传和读取mat文件

  1. 用python安装mat4py。在成功安装后,我们得到:
  2. 成功安装mat4py-0.5.0。
  3. 从mat4py导入loadmat。
  4. 保存文件的实际位置在一个变量。
  5. 使用python
    加载mat文件格式到数据值 pip install mat4py
    from mat4py import loadmat
    boston = r"E:\Downloads\boston.mat"data = loadmat(boston, meta=False) < / >