在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中创建的内容一致,读取成功。