写在前面
经常会使用matlab处理数据,比如之前在进行空间滤波发现matlab自带的空间滤波函数。但是,由于后续使用python绘图更熟练一点,所以涉及到在python中读取matlab输出的文件,一般以.mat
文件为主。下面测试了几种读取方式,选了一个比较好用的方式。
这里简单将读取的.mat
文件分为两种数据类型:
- 1、array数组(如网格数据)
- 2、str字符串列表(如网页链接)
对于数组的读取
scipy.io.loadmat
对于一般的数组,可以通过scipy库的相关函数包进行读取,命令如下:
import scipy.io as siof = sio.loadmat(r'I:\data.mat')print(f.keys())data=f['MASK']
将mat文件中的变量的名称进行打印并进行读取,比如我这里的变量名称为:MASK
,这样得到的数据data就是标准存储的数组格式
mat4py.loadmat
安装方式:
conda / pip install mat4py
这里也可以通过mat4py包的相关函数进行读取,读取相同的数据,得到的数据类型为:list-列表
或者是dict-字典
from mat4py import loadmatf = loadmat(r'I:\data.mat')['MASK']
但是感觉不如直接用scipy的好用
mat73.loadmat
安装方式:
conda / pip install mat73
读取方式:
import mat73f = mat73.loadmat(r'I:\data.mat')
这也是一种读取方式,但是会受限于matlab的版本,比如说我这里使用读取上面相同的数据,就会报错提示
TypeError: I:\data.mat is not a MATLAB 7.3 file. Load with scipy.io.loadmat() instead.
提醒我们使用scipy.io.loadmat()
来读取上述文件
对于字符串的读取
如果你通过matlab报错输出的文件,不是数组而是字符串等等。
import scipy.io as siof = sio.loadmat(r'I:\str.mat')
使用scipy.io.loadmat()
会发生以下报错:
NotImplementedError: Please use HDF reader for matlab v7.3 files, e.g. h5py
然后根据他的提示呢,我们可以分别使用刚刚上面提到的mat73.loadmat()
或者是h5py
import mat73f= mat73.loadmat(r'I:\str.mat')
h5py
安装h5py:
conda install h5py
这里需要提醒一句的是,如果你使用 pip install h5py,而且你在之前安装过geopandas或者salem,且是在windows环境安装的,需要注意版本的依赖,因为安装h5py时,是会安装相关版本适配的gdal库的;所以我建议你使用 conda install h5py
。
读取方式:
import h5pyf = h5py.File(r'I:\str.mat')print(f.keys())
使用下来感觉mat73可以直接将文件中的数值提取出来,相对来说更方面一点。
总结
总体上,比较了对于纯数组array以及纯字符str输出的mat文件在python中的读取方式。
对于array输出的mat文件,推荐使用scipy.io.loadmat(r'./data.mat')
进行读取,而对于str输出的mat文件,推荐使用mat73.loadmat(r'./data.mat')
进行读取。
当然,这里也存在一些问题,比如说当输出的mat文件包含多种数据类型时,是否上述两种方式会不适应,下次具体遇到时再具体解决。
https://stackoverflow.com/questions/874461/read-mat-files-in-python