Python读写mat文件(使用scipy.io)

Posted 天河逐月

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python读写mat文件(使用scipy.io)相关的知识,希望对你有一定的参考价值。

在matlab中,数据可保存为mat文件,使用save和load命令可进行读写操作。而在Python中,也可以对mat文件进行读写。

一、由matlab向Python传数据(Python读取mat文件)

第一步:使用matlab创建变量并保存至mat文件

使用matlab分别创建数、数组、元胞数组等类型的变量,然后保存到mat文件中。

clear
path = 'D:\\temp\\mydata.mat';  % 用于存放mat文件的路径
n = 12;  % 数
s = 'Hello';  % 字符串
A = [1,2,3,4,5; 6,7,8,9,0];  % 数组
C = 'str1','str2','str3'; 'str4','str5','str6';  % 元胞数组
save(path, 'n', 's', 'A', 'C');  % 保存上述变量

注意存放mat文件的文件夹必须存在,即要事先创建好,否则会报错。

保存后,来读取一下其中的数据:

 可以确定上述变量已保存至mat文件。

第二部,使用Python读取上述mat文件

使用scipy.io中的loadmat方法对mat文件进行读取。编辑代码如下:

from scipy.io import loadmat

path = r"D:\\temp\\mydata.mat"  # mat文件路径
data = loadmat(path)  # 读取mat文件
print(data.keys())  # 查看mat文件中包含的变量

Out:
dict_keys(['__header__', '__version__', '__globals__', 'A', 'C', 'n', 's'])

可见读取到的mat文件中包含变量n、s、A、C,与matlab保存的变量一致。

分别读取这些变量:

from scipy.io import loadmat

path = r"D:\\temp\\mydata.mat"  # mat文件路径
data = loadmat(path)
n = data['n']  # 数
s = data['s']  # 字符串
A = data['A']  # 数组
C = data['C']  # 元胞数组

print(n)
print(s)
print(A)
print(C)

运行后显示结果如下:

[[12]]
['Hello']
[[1 2 3 4 5]
 [6 7 8 9 0]]
[[array(['str1'], dtype='<U4') array(['str2'], dtype='<U4')
  array(['str3'], dtype='<U4')]
 [array(['str4'], dtype='<U4') array(['str5'], dtype='<U4')
  array(['str6'], dtype='<U4')]]

与matlab创建的内容一致,可见mat文件已被成功读取。

但注意观察读取出来的各个变量的数据类型,发现均为“numpy.ndarray”类型。所以要想使用读取出来的数据,需要再次从ndarray中进行读取。

In:
n0 = n[0][0]  # 读取单个数
s0 = s[0]  #读取字符串
A0 = A[0][2]  # 读取数组中第1行第3个元素
C0 = C[0][1][0]  # 读取元胞数组中第1行第2个元素
print(n0)
print(s0)
print(A0)
print(C0)

Out:
12
Hello
3
str2

这样就读取出了指定的数据。

二、由Python向matlab传数据(Python写入mat文件)

第一步:使用Python创建变量并保存至mat文件

使用Python创建数、字符串、数组等类型的变量,然后使用scipy.io中的savemat方法在指定的路径保存mat文件。

from numpy import array
from scipy.io import savemat

# 创建变量
path = r"D:\\temp\\mydata02.mat"  # 路径
num = 12  #  数
str = 'abcde'  # 字符串
list = array([1,2,3,4,5])  # 数组

# 构造字典,用于保存变量
data = 
data.update('num':num)
data.update('str':str)
data.update('list':list)

# 保存变量到mat文件
savemat(path, data)

注意,Python中的字典(Dictionary)和集合(Set)不能保存。

第二步:使用matlab读取上述mat文件

打开matlab并读取该mat文件,如下图所示:

与Python中创建的内容一致,读取成功。 

SciPy中两个模块:io 和misc

 
  1. 读写.mat文件

如果你有一些数据,或者在网上下载到一些有趣的数据集,这些数据以Matlab的.mat 文件格式存储,那么可以使用scipy.io 模块进行读取。

data = scipy.io.loadmat(‘test.mat‘) 
  • 1
  • 2

上面代码中,data 对象包含一个字典,字典中的键对应于保存在原始.mat 文件中的变量名。由于这些变量是数组格式的,因此可以很方便地保存到.mat 文件中。你仅需创建一个字典(其中要包含你想要保存的所有变量),然后使用savemat() 函数:

data = {}  
data[‘x‘] = x  
scipy.io.savemat(‘test.mat‘,data) 
  • 1
  • 2
  • 3
  • 4

因为上面的脚本保存的是数组x,所以当读入到Matlab 中时,变量的名字仍为x。关于scipy.io 模块的更多内容, 请参见在线文档http://docs.scipy.org/doc/scipy/ reference/io.html。

  1. 以图像形式保存数组

因为我们需要对图像进行操作,并且需要使用数组对象来做运算,所以将数组直接保存为图像文件1 非常有用。本书中的很多图像都是这样的创建的。

imsave() 函数可以从scipy.misc 模块中载入。要将数组im 保存到文件中,可以使用下面的命令:

from scipy.misc import imsave  
imsave(‘test.jpg‘,im) 
  • 1
  • 2
  • 3

scipy.misc 模块同样包含了著名的Lena 测试图像:

lena = scipy.misc.lena() 
  • 1
  • 2

该脚本返回一个512×512 的灰度图像数组。

 

以上是关于Python读写mat文件(使用scipy.io)的主要内容,如果未能解决你的问题,请参考以下文章

从使用 Scipy.io.loadmat 加载的 .mat 文件访问数组内容 - python

使用 scipy.io.loadmat 从 .mat Matlab 文件中将字典键转换为 Python 中具有相同值的变量名

无法使用scipy.io或hdf5storage将mat文件加载到python中

如何使用 Scipy.io.loadmat 将 Matlab mat 文件中的字符串单元格数组加载到 Python 列表或元组中

Scipy IO Loadmat 错误:ValueError:Mat 4 mopt 格式错误

在 python 中访问包含 matlab 类的 .mat 文件