Matlab中的mat數(shù)據(jù)轉(zhuǎn)成python中使用的npy數(shù)據(jù)遇到的坑及解決
最近做的工作涉及將matlab中的處理好的mat數(shù)據(jù)轉(zhuǎn)換成npy數(shù)據(jù),送入到網(wǎng)絡(luò)中學(xué)習(xí)。在處理數(shù)據(jù)時(shí)遇到的一些問題總結(jié)如下。
Matlab中的Cell
cell數(shù)組的數(shù)組(指的是兩層cell)不能使用cell2mat函數(shù)
為了解決這個(gè)問題,涉及matlab中元組數(shù)據(jù)的讀取和保存。
cell的讀取
cell的{}是指向cell的內(nèi)容,而cell的()是指向cell的位置。
cell和mat矩陣的轉(zhuǎn)換
單個(gè)的cell轉(zhuǎn)換成mat可以直接使用cell2mat函數(shù)。
cell2mat:將元胞數(shù)組成普通矩陣(要求cell元胞數(shù)組的所有內(nèi)容都必須為相同數(shù)據(jù)類型,可以為字符,會(huì)轉(zhuǎn)化為字符矩陣)
如果是兩層以上的cell可以自己寫循環(huán)依次將數(shù)據(jù)讀出來,存入另一個(gè)數(shù)據(jù)中。
for i=1:n_actions_train ? ? ?for j=1:n_num ? ? ? ? ?matrix_train(i,j,:,:,:)=train_fea{i}{j}; ?%train_fea是cell數(shù)據(jù) ? ? ?end ? ?? ?end
Matlab中的reshape和permute
reshape
重構(gòu)函數(shù),將給定的數(shù)據(jù)重構(gòu)成我們需要的size的數(shù)據(jù)。
用法:
B = reshape(A,sz) B = reshape(A,sz1,...,szN)
B = reshape(A,sz) 使用大小向量 sz 重構(gòu) A 以定義 size(B)。
例如,reshape(A,[2,3]) 將 A 重構(gòu)為一個(gè) 2×3 矩陣。
sz 必須至少包含 2 個(gè)元素,prod(sz) 必須與 numel(A) 相同。
% eg. 1: 將 1×10 向量重構(gòu)為 5×2 矩陣。 A = 1:10; B = reshape(A,[5,2])
每個(gè)維度的大小,指定為具有最多一個(gè) [](可選)的兩個(gè)或以上的整數(shù)。必須至少指定 2 個(gè)維度大小,并且最多一個(gè)維度大小可以指定為 [],這樣會(huì)自動(dòng)計(jì)算該維度的大小以確保 numel(B) 與 numel(A) 相匹配。
當(dāng)使用 [] 自動(dòng)計(jì)算維度大小時(shí),顯式指定的維度必須均勻劃分為輸入矩陣 numel(A) 中的元素?cái)?shù)目。
對(duì)于第二個(gè)維度以上的維度,輸出 B 不反映大小為 1 的尾部維度。例如,reshape(A,3,2,1,1) 生成 3×2 矩陣。
permute
置換數(shù)組維度
B = permute(A,dimorder) eg. 1 : 創(chuàng)建一個(gè) 3×4×2 數(shù)組并對(duì)其進(jìn)行置換,交換第一個(gè)維度和第三個(gè)維度,從而得到 2×4×3 數(shù)組. A = rand(3,4,2) B = permute(A,[3 2 1])
reshape和permute函數(shù)的區(qū)別主要在于reshape會(huì)改變數(shù)據(jù)的維度,但數(shù)據(jù)總量是不變的,只是按原來數(shù)據(jù)的行列組合變化到新的數(shù)據(jù)排列方式,其中每個(gè)維度的size都可能發(fā)生變化。
permute函數(shù)只是調(diào)換數(shù)據(jù)維度的順序,比如我們要從某個(gè)數(shù)據(jù)中拿到某兩個(gè)維度之間的矩陣,我們可以先用這個(gè)函數(shù)將這兩個(gè)維度先調(diào)到外面,方便我們?nèi) ?/p>
這個(gè)函數(shù)不會(huì)改變每個(gè)維度的size。
Please use HDF reader for matlab v7.3 files
matlab中對(duì)于較大打mat文件,都建議使用v7.3 來保存數(shù)據(jù),但是scipy包中的loadmat函數(shù)不能讀取這個(gè)版本的數(shù)據(jù),搜了一下問題,發(fā)現(xiàn)h5py包中的File函數(shù)可以讀取這個(gè)數(shù)據(jù),添加h5py后使用h5py.File()函數(shù)就可以讀取了。
IndexError: only integers, slices (:), ellipsis (...)……
經(jīng)檢查,錯(cuò)誤之處在索引處使用了浮點(diǎn)數(shù),把matlab中獲得的數(shù)據(jù)強(qiáng)制轉(zhuǎn)換成int型。
因?yàn)閙atlab中數(shù)據(jù)默認(rèn)保存成double數(shù)據(jù),所以如果轉(zhuǎn)換到其他語言時(shí),要注意到這一點(diǎn),并且提前強(qiáng)制轉(zhuǎn)換。
IndexError: index *** is out of bounds for axis 1 with size ***
問題在于下表越界,因?yàn)閺膍atlab中獲得的鄰接矩陣記錄鄰居時(shí),下標(biāo)從1開始,而python中默認(rèn)下標(biāo)從0開始。
值得注意的是matlab中下標(biāo)維度都是從1開始的,而且matlab中的矩陣讀取順序是列優(yōu)先的,其他語言比如python和C++都是行優(yōu)先的。所以數(shù)據(jù)遷移過去都需要先transpose。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python實(shí)現(xiàn)通過文件路徑獲取文件hash值的方法
這篇文章主要介紹了Python實(shí)現(xiàn)通過文件路徑獲取文件hash值的方法,結(jié)合實(shí)例形式分析了Python針對(duì)文件進(jìn)行hash運(yùn)算的實(shí)現(xiàn)方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-04-04Python中的命令行參數(shù)解析工具之docopt詳解
docopt 是一個(gè)用來解析命令行參數(shù)的工具,當(dāng)想要在 Python 程序后面附加參數(shù)時(shí),就不需要再為此而發(fā)愁了。下面這篇文章主要介紹了Python中命令行參數(shù)解析工具之docopt的相關(guān)資料,介紹的非常詳細(xì),需要的朋友們下面來一起看看吧。2017-03-03python fabric實(shí)現(xiàn)遠(yuǎn)程操作和部署示例
這篇文章主要介紹了python使用fabric實(shí)現(xiàn)遠(yuǎn)程操作和部署示例,需要的朋友可以參考下2014-03-03python中l(wèi)xml.etree 和 ElementTree 的區(qū)別解析
lxml.etree 提供了更多的功能,例如 XPath、XSLT、Relax NG、 和 XML 模式支持,etree 對(duì) Python unicode 字符串的想法與 ElementTree 不同,本文給大家介紹python中l(wèi)xml.etree 和 ElementTree 的區(qū)別,感興趣的朋友一起看看吧2024-01-01