Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
读取Python中的.mat文件_Python_Matlab_File Io_Scipy_Mat File - Fatal编程技术网

读取Python中的.mat文件

读取Python中的.mat文件,python,matlab,file-io,scipy,mat-file,Python,Matlab,File Io,Scipy,Mat File,可以在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,还是scipy.io.loadmat都不适用于MATLAB阵列7.3版。但好的方面是Matlab7.3版文件是hdf5数据集。因此,可

可以在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
,还是
scipy.io.loadmat
都不适用于MATLAB阵列7.3版。但好的方面是Matlab7.3版文件是hdf5数据集。因此,可以使用多种工具读取它们,包括

对于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本身的问题。如果你有MATLAB,这可能是值得考虑的(我自己没有尝试过,但它有很多功能,不仅仅是阅读MATLAB文件)。但是,我不知道是否允许将其分发给其他用户(如果这些用户有MATLAB,这可能不是问题。否则,也许NumPy是正确的选择?)

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

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

  • 首先阅读文档
  • 使用十六进制编辑器(如)查看要解析的引用
    .mat
    -文件
  • 通过将字节保存到.txt文件并注释每行,尝试找出每个字节的含义
  • 使用类保存每个数据元素(例如
    miccompressed
    miMATRIX
    mxDOUBLE
    ,或
    miINT32
  • .mat
    -文件的结构最适合将数据元素保存在树型数据结构中;每个节点有一个类和子节点

安装MATLAB 2014b或更新版本后,可以使用:

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)
print(type(mat))
#OUTPUT - <class 'dict'>
检查MAT变量的类型

import scipy.io
mat = scipy.io.loadmat(file_name)
print(type(mat))
#OUTPUT - <class 'dict'>
打印(类型(mat))
#输出-

字典中的键是MATLAB变量值是分配给这些变量的对象

有一个很好的包,名为

pip install mat4py
使用起来很简单(从网站上):

从MAT文件加载数据

import scipy.io
mat = scipy.io.loadmat(file_name)
print(type(mat))
#OUTPUT - <class 'dict'>
函数
loadmat
只使用Python的
dict
list
对象,将存储在MAT文件中的所有变量加载到一个简单的Python数据结构中。数值数组和单元格数组将转换为按行排序的嵌套列表。压缩数组以消除只有一个元素的数组。生成的数据结构由与格式兼容的简单类型组成

示例:将MAT文件加载到Python数据结构中:

from mat4py import loadmat

data = loadmat('datafile.mat')
变量
data
是一个
dict
,其变量和值包含在MAT文件中

将Python数据结构保存到MAT文件中

import scipy.io
mat = scipy.io.loadmat(file_name)
print(type(mat))
#OUTPUT - <class 'dict'>
Python数据可以通过函数
savemat
保存到MAT文件中。数据的结构必须与
loadmat
的结构相同,即它应该由简单的数据类型组成,如
dict
list
str
int
float

示例:将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文件读取到混合数据类型的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

只需按以下步骤操作:

  • 安装软件包:
    pip安装pymatreader

  • 导入此软件包的相关功能:
    from pymatreader Import read\u mat

  • 使用函数读取matlab结构:
    data=read\u mat('matlab\u struct.mat')

  • 使用
    data.keys()
    查找数据的实际存储位置

    • 这些键通常看起来像:
      dict_键([''uuuuuu header'uuuuuuuuu'、''uuuuu version'uuuuuuuuuuu'、''uuuuuuu globals'uuuuuuuuuuuuu'、'uuuuuuuuu globals'、'data'uu opp'])data\u opp
      将是存储数据的实际键。当然,此密钥的名称可以在不同的文件之间更改
  • 最后一步-创建数据帧:
    my_df=pd.dataframe(data['data\u opp'])

  • 就是这样:)

    也可以使用HDF5存储库。有关matlab版本支持的详细信息,请参阅官方文档

    import hdf5storage
    
    label_file = "./LabelTrain.mat"
    out = hdf5storage.loadmat(label_file) 
    
    print(type(out)) # <class 'dict'>
    
    导入HDF5存储
    label_file=“./LabelTrain.mat”
    out=hdf5storage.loadmat(标签文件)
    打印(打印(输出))#
    
    除了v4(1.0级)、v6、v7至7.2 MATFILE的
    scipy.io.loadmat
    和7.3格式MATFILE的
    h5py.File
    之外,还有另一种类型的MATFILE,采用文本数据格式而不是二进制格式,通常由倍频程创建

    scipy.io.loadmat
    h5py.File
    都无法加载它们(在scipy 1.5.3和h5py 3.1.0上进行了测试),我找到的唯一解决方案是