學習筆記191—Python 從 mat 文件讀寫 到 h5py 文件包


采用 Python 讀取 matlab 中 .mat文件的方法有很多,中外文的論壇上都不少,相關博文,比如

【摘要】

  python在讀寫matlab文件時常用到scipy.io文件,但,針對大文件(有網友睜着直徑為8848米的小眼睛說的大小的分界點在2GB)以及存儲版本在“matlab-v7.3”以上的文件就拙計了,這里分享一種剛剛學到處理方式,用h5py模塊,詳細介紹以及Python源碼詳見本文。

 【正文】

 1、如果你的matlab的版本比較舊,保存的.mat 格式為‘-v7.3’以前的版本,可以采用:scipy.io即可。假如有一個name_box.mat,其中,box: {1x29992 cell}和name: {1x29992 cell}。我們想要讀取其中的box的內容,源碼如下:

  1. import scipy.io as sio
  2. boxes = sio.loadmat(’name_box.mat‘)[ 'box'].ravel()

這樣boxes就是一個list,可以采用boxes[i]顯示每個array的內容了,boxes.shape[0]為cell的個數

2、如果你的matlab的版本比較新,保存的.mat格式為‘-v7.3’的版本,由於scipy.io不支持,所以要采用hdf5,arr.mat是一個m*n的矩陣文件,代碼准備先對arr讀入,再對 TrainSet_rotate.h5文件實現寫入操作,源碼如下:

import h5py
import numpy as np
file = h5py.File( 'F:\\wfpdm\\20150702_2105\\arr.mat','r')
arr = file[ 'arr'][:]
# h5py 用於文件讀寫 詳細用例
data = np.array( [ 222,333,444] )
label = np.array( [ 0,1,0] )
img_num = np.array( [ 0,1,2] )
# 創建HDF5文件
file = h5py.File( 'TrainSet_rotate.h5','w')
# 寫入
file.create_dataset( 'train_set_x', data = data)
file.create_dataset( 'train_set_y', data = label)
file.create_dataset( 'train_set_num',data = img_num)
file.close()
# 讀方式打開文件
file=h5py.File( 'TrainSet_rotate.h5','r')
# 盡管后面有 '[:]', 但是矩陣怎么進去的就是怎么出來的,不會被拉長(matlab后遺症)
train_set_data = file[ 'train_set_x'][:]
train_set_y = file[ 'train_set_y'][:]
train_set_img_num = file[ 'train_set_num'][:]

因此可見:Python 從 mat 文件的讀寫和存儲 到 h5py 文件包。但是,在讀取matlab文件的時候,往往不是一層 .mat 就足以解決問題的,.mat 文件中可能是存放的 cell(100*200) 數據, cell(100*200)數據中又分為多個 cell 。那么,如何處理這樣的數據結構,實現Python對matlab這一類型數據的讀取呢,現對該問題,詳解如下:

【問題一】

matlab之中有FEAT_Name.mat文件,該文件的形式如下

FEAT_Name.mat <1x10 cell> ——> each element is <600x5755 double>

先要實現對FEAT_Name元組的首個矩陣的讀取操作,代碼實現如下

import h5py
myfile=h5py.File('F:\\wfpdm\\20150702_2105\\FEAT_Name.mat','r') data = [myfile[element[0]][:] for element in myfile['FEAT_Name']] print data[1].shape Out: (5755,600)

解析

1)for element in myfile['FEAT_Name'] 實現了對 myfile['FEAT_Name']  的 cell 的遍歷;

2)myfile[element[0]]恰好可以理解為myfile[element],即當前文件的當前cell;

3)[myfile[element[0]][:] for element in myfile['FEAT_Name']],實現了將數據以list結構存入data之中;

4)數據轉置了600x5755變成了5755x600,需要實現再轉置操作;

【問題二】

matlab之中有f.mat文件,該文件的形式如下

 ——> rank <1x454 cell> ——> each element is <53x50 double> f.mat  ——> compare <1x454 cell> ——> each element is <53x50 double>

先要實現對rank元組的首個矩陣的操作,代碼實現如下

import h5py
f = h5py.File("f.mat") data = [f[element[0]][:] for element in f['rank']] result: In : data[0].shape Out: (50L, 53L) In : data[1].shape Out: (50L, 53L)

解析

這里只是多一步,將matlab數據的 cell.name 寫入即可。至此,Python讀取matlab的數據方法介紹完畢。

【復盤】

確實存在轉置,只是一般的array結構的 .mat 文件不存在,但是針對cell結構的 .mat 文件 存在。需要進行再轉置操作,還原數據。

詳見:Python 從 mat 文件的讀寫和存儲 到 h5py 文件包

參考連接:http://www.voidcn.com/article/p-uicrnszv-vh.html

https://blog.csdn.net/u013630349/article/details/47090299

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM