網站首頁 編程語言 正文
處理matlab的mat數據
python 和matlab是2個常用的實驗室平臺工具,在一些應用下,這2個不同平臺下的數據會打交道,因此如何讀取和保存顯得尤為重要,這里需要用到python的第三方平臺下的scipy模塊。
先用下面這個命令檢查是否下載好scipy
import scipy
如果報錯,用python install scipy 或者 conda install scipy 下載安裝
需要用到scipy中的輸入輸出類中的loadmat 和savemat方法:?
import scipy.io as sio
?
sio.loadmat(file_name, mdict=None, appendmat=True, **kwargs)
sio.savemat(file_name, mdict, appendmat=True, format='5', long_field_names=False, do_compression=False, oned_as='row'
下面介紹一個簡單的錯誤例子:(需要傳字典格式的參數)
import scipy.io as sio
import numpy as np
?
x = np.ones((3,3))
?
x
Out[86]:?
array([[1., 1., 1.],
? ? ? ?[1., 1., 1.],
? ? ? ?[1., 1., 1.]])
?
sio.savemat('f.mat',x)
Traceback (most recent call last):
?
? File "<ipython-input-87-d739bc03c885>", line 1, in <module>
? ? sio.savemat('f.mat',x)
下面介紹一個簡單的保存 導入例子:
import scipy.io as sio
import numpy as np
?
x = np.ones((3,3))
?
x
Out[86]:?
array([[1., 1., 1.],
? ? ? ?[1., 1., 1.],
? ? ? ?[1., 1., 1.]])
?
sio.savemat('f.mat',{"x":x})
?
?
?
myMat =sio.loadmat('f.mat')
?
print(myMat) #輸出為字典
{'__header__': b'MATLAB 5.0 MAT-file Platform: nt, Created on: Fri Aug 21 16:29:37 2020', '__version__': '1.0', '__globals__': [], 'x': array([[1., 1., 1.],
? ? ? ?[1., 1., 1.],
? ? ? ?[1., 1., 1.]])}
?
#以保存名為key,輸出list value
print(myMat['x'])
[[1. 1. 1.]
?[1. 1. 1.]
?[1. 1. 1.]]
如果想把python數據保存為mat數據,則需要cell格式數據,而python沒有實現cell,因此需要用到numpy模塊,可以看這篇博客。
處理matlab的*.mat格式數據及常見錯誤匯總
由于matlab和python兩種語言的編程方式不同,有時候在進行程序混編時,需要利用python調用matlab下的格式數據,下面介紹如何調用mat格式數據及常見錯誤解決方法,僅供參考!
一、數據讀取錯誤
# 最初用loadmat讀取數據
import numpy as np
from scipy.io mport loadmat
img = loadmat('im.mat')['im'] #im.mat為mat數據的名稱,['im'] 中的im表示該文件下im的數據
使用如上代碼讀取數據時,會出現如下錯誤:
如果出現以上錯誤,改用下面方式讀取,
import h5py
img = h5py.File('im.mat')['im']
img = h5py.File('im.mat','r')['im'] # 無警告
二、數據類型錯誤
(用Python處理圖像時,若涉及加減運算,溢出差值被重新賦值255-0)
# python代碼
import h5py
import numpy as np
img = h5py.File('im.mat')['im']
# python中的M,N剛剛好與matlab中的M,N取值相反,此處進行轉置與matlab相同矩陣格式進行處理
x = np.array(img).T
[M, N] = x.shape
if M < 16 and N < 16:
score = -2
# Feature Extraction:
# 1. horizontal features
d_h = x[:, 1:N] - x[:, 0:N - 1] # 該步操作圖像產生滿溢,溢出后差值可能都被賦為255,依次遞減
此種情況下,d_h數據會出現滿溢情況,下面就是相同數據在python和matlab下面進行運算的差異性。
% Matlab 代碼
img = laod('im.mat')
[M, N] = size(x)
if M < 16 | N < 16
score = -2;
end
x = double(img); % 將無符號類型uint8數據類型轉換為double類型
% Feature Extraction:
% 1. horizontal features
d_h = x(:, 2:N) - x(:, 1:(N-1));
原因: 導入數據類型為 uint8 數據格式,該種格式下是沒有負數的,在matlab中進行運算時,先將uint8數據類型轉化為了double類型,然后進行了減法運算,所以會出現如上結果,但是在python中,由于沒有double類型,所以需要自己手動設置數據格式類型,只需要改成不是uint8格式即可(具體格式需要根據需求,此處改成了int8格式類型)。解決方法非常簡單,只需在上面的一行代碼中加入數據類型即可:
x = np.array(img,dtype = 'int8').T # 對讀取的uint8格式數據進行重新定義一下格式即可
x = np.array(img,dtype = 'float').T # 下面這種格式雖然是浮點型,但是計算過程不容易出錯,如果是上面的int8會出現部分錯誤,需要注意
現在看一下結果,就跟matlab處理結果一樣了。
雖然下面是浮點型,但是能夠保證數據轉化的精度和準確性,img的影像數據轉化成數值時不出錯誤,非必要情況下,不要使用int8數據格式,因為使用int8格式數據類型,會在某些部分出錯,這一定要注意。(改組數據中(0,80)數值在int8格式轉化時出錯,原始數值為129,轉化之后變成127,而使用float格式則不會出現錯誤)
原始數據unit8數據格式類型的數值為129,在python中不同格式類型的值就不一樣。
所以uint8格式,在python運算中還是轉換成float格式靠譜,轉換成int8真的不行呀!
原文鏈接:https://blog.csdn.net/qq_39463175/article/details/108149649
相關推薦
- 2023-01-14 ubuntu開機后ROS程序自啟動問題_Linux
- 2022-09-09 python處理xml文件操作詳解_python
- 2022-09-30 oracle表空間不足ORA-01653的問題:?unable?to?extend?table_or
- 2022-07-26 Docker部署Golang+Gin和Python+Tornado后端
- 2023-05-08 C語言中關于樹和二叉樹的相關概念_C 語言
- 2022-06-26 python數據處理之Pandas類型轉換的實現_python
- 2022-11-03 react+tsx中使用better-scroll詳解_React
- 2023-05-30 基于CUDA?out?of?memory的一種神奇解決方式_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支