mat矩阵和npy矩阵实现互相转换(python和matlab)
作者:山上有只羊M
这篇文章主要介绍了mat矩阵和npy矩阵实现互相转换(python和matlab),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
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文件之外,我们还可以通过PY把数据保存文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数组,不再有矩阵类型。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。