首頁 > 軟體

mat矩陣和npy矩陣實現互相轉換(python和matlab)

2022-07-12 18:02:30

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陣列,不再有矩陣型別。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com