2016-07-26 77 views
0

我正在將matlab代碼翻譯爲python。我有一個名爲'AK_1'的.mat文件中有幾個矩陣。我只想訪問這些矩陣之一中的數據。 matlab代碼以這種方式訪問​​它,其中.response1是所需矩陣:使用python訪問.mat文件中的矩陣

numtrials1 = subject_data1.response1(1,:);

我試着將所有的數據加載到一個字典,所以我可以通過它循環到所需的矩陣與此代碼,但沒有產生一個可行的結果。

subject_data1_dict = {}

subject_data1 = scipy.io.loadmat( './ MAT_Data_Full_AAAD_V2/AK_1.mat',subject_data1_dict)

如何只能訪問矩陣 '響應1'在文件AK_1.mat中?

+1

您是否閱讀過「scipy.io.loadmat」的文檔? – Suever

+0

as jlarsch回答'struct_as_record = False'在正確的軌道上,但它並沒有載入所有這些矩陣 – pproctor

回答

1

假設你有下面的結構S上myfile.mat

S = 
    response1: [5x5 double] 
    response2: [5x5 double] 
    response3: [5x5 double] 

你想從蟒蛇訪問response1。然後:

>>> from scipy.io import loadmat 
>>> D = loadmat("myfile.mat", variable_names = ("S",)) 
>>> D["S"]["response1"] # returns matlab's S.response1 

如果您想選擇包含在文件不僅僅是■在多個變量,你只需要添加他們的元組,即variable_names=("S","otherVar")

很顯然,如果你有興趣是response1數組,您可以繞過收集字典,即:

>>> response1 = loadmat("myfile.mat", variable_names = ("S",))["S"]["response1"] 
>>> response1 
array([[ array([[ 9, 1, 2, 2, 7], 
     [10, 3, 10, 5, 1], 
     [ 2, 6, 10, 10, 9], 
     [10, 10, 5, 8, 10], 
     [ 7, 10, 9, 10, 7]], dtype=uint8)]], dtype=object) 
+0

我認爲他在.mat文件中沒有三個獨立變量,而是包含多個數組的單個matlab結構。因此點符號(subject_data1.response1)? – jlarsch

+0

啊,我明白了,好的。這就說得通了;我誤解了這個問題。我會更新我的答案。 :) –

+0

這是做到這一點的確切方法,非常簡單的解決方案。謝謝! – pproctor

0

創建和保存含有在Matlab 3點矩陣的結構:在python

from scipy.io import loadmat 
matfile = loadmat('d:/struct.mat') 

可以例如b.aa和b.bb經由現在訪問

a=1:5 
b.aa=a 
b.bb=a 
b.cc=a 
save(struct.mat,'b') 

負載.MAT文件:

matfile[('b')][0][0][0] 
matfile[('b')][0][0][1] 

這就是你想要的嗎?

+0

這與我的代碼產生的結果大致相同,並不是所有顯示的矩陣都包含我需要訪問的矩陣 – pproctor

+0

你能鏈接一個.mat文件,它具有類似導致問題的結構嗎? – jlarsch

+0

@proctor檢查編輯的答案 – jlarsch