Python中mat矩阵与npy矩阵的相互转换及文件读写详解
本文详解Python中mat矩阵与npy矩阵的相互转换方法。通过scipy.io库实现mat文件的保存与读取,重点说明savemat需以字典形式传入变量及loadmat返回字典结构的处理。同时介绍np.save与np.load对npy格式的支持,并解析读取mat文件时可能遇到的v7.3版本兼容问题及矩阵转置注意事项,提供完整代码示例供参考。
mat矩阵和npy矩阵互相转换
将numpy.narray矩阵保存为mat文件
import numpy as np
import scipy.io as io
mat_path = 'your_mat_save_path'
mat = np.zeros([4, 20])
io.savemat(mat_path, {'name': mat})需注意,此处涉及的mat文件操作针对的是numpy类型的数据结构。
读取mat文件
import numpy as np
from scipy import io
mat = io.loadmat('yourfile.mat')
# 如果报错:Please use HDF reader for matlab v7.3 files
# 改为下一种方式读取
import h5py
mat = h5py.File('yourfile.mat')
# mat文件里可能有多个cell,各对应着一个dataset
# 可以用keys方法查看cell的名字, 现在要用list(mat.keys()),
# 另外,读取要用data = mat.get('名字'), 然后可以再用Numpy转为array
print(mat.keys())
# 可以用values方法查看各个cell的信息
print(mat.values())
# 可以用shape查看维度信息
print(mat['your_dataset_name'].shape)
# 注意,这里看到的shape信息与你在matlab打开的不同
# 这里的矩阵是matlab打开时矩阵的转置
# 所以,我们需要将它转置回来
mat_t = np.transpose(mat['your_dataset_name'])
# mat_t 是numpy.ndarray格式
# 再将其存为npy格式文件
np.save('yourfile.npy', mat_t)npy文件与mat文件的保存与读取
除了常见的csv和excel格式外,利用Python还可以将数据保存为npy或mat格式文件。
1. npy文件
npy是numpy专用的文件格式,保存数据使用np.save()方法,读取数据则使用np.load()方法。
具体示例如下:
import numpy as np
a = np.mat('1, 2, 3;4, 5, 6')
print(a)
print(type(a))
print("=================================")
b = np.array([[1, 2, 3], [4, 5, 6]])
print(b)
print(type(b)) 
保存文件:
如图所示,矩阵和numpy数组均支持以npy文件类型进行保存。
np.save('a.npy', a)
np.save('b.npy', b) 
读取文件
data1 = np.load('a.npy')
data2 = np.load('b.npy')
print(data1)
print(type(data1))
print("=================================")
print(data2)
print(type(data2)) 
如图所示,npy数据被成功读取,且数据类型均为numpy数组。
2. mat文件
保存为mat文件依赖于scipy库中的scipy.io.savemat()方法,而读取则需要用到scipy.io.loadmat()方法。
保存时,除了传入变量本身,还需将该变量的类型以字典形式传入,同样支持numpy数组和矩阵。
具体示例如下:
import numpy as np
from scipy import io
a = np.mat('1, 2, 3;4, 5, 6')
print(a)
print(type(a))
print("=================================")
b = np.array([[1, 2, 3], [4, 5, 6]])
print(b)
print(type(b))
io.savemat('a.mat', {'matrix': a})
io.savemat('b.mat', {'array': b})

读取数据
data1 = io.loadmat('a.mat')
print(data1)
print(type(data1))
print("=================================")
data2 = io.loadmat('b.mat')
print(data2)
print(type(data2))
如图所示,数据成功被读取。但读取结果是一个字典,若需进一步获取数据,则需根据键名将其取出:
print(data1['matrix'])
print(type(data1['matrix']))
print("=================================")
print(data2['array'])
print(type(data2['array'])) 
取出时的键与存储时的变量名相关,取出的数据均为numpy数组,不再保留矩阵类型。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













