2011-10-01 31 views
2

我對matlab和python很新,需要在matlab單元格數組中使用python中的一些值。matlab to python:獲取matlab單元格數組值

我有一個整數單元陣列,經過我執行這行代碼,並打印出結果,我得到這個:

a = loadmat('file.mat') 
print a 

{'__version__': '1.0', '__header__': 'MATLAB 5.0 MAT-file, Platform: PCWIN, Created on: Wed Sep 21 15:30:15 2011', 'juncForward_c': array([[ [[ [[ ([[30]], **[[91], [87]]**, [[3]], [[2.2455372690184494, 3.6052402625905993, 5.5884470309828833]], [[14.0, 4.0, 15.4]], [[-1, -1, 2]], [[91, 89, 93], [88, 85, 86]], [[500, 500, 5]], [[1, 2, 3]], [[11.133333333333333]], **[[4]]**, [[1]], [[1]], [[1.0], [20.365168528421695]])]] 

[[ ([[30]], **[[99], [80]]**, [[3]], [[4.0376480381611373, 2.3561944901923448, 6.0857897473297058]], [[10.0, 15.4, 16.600000000000001]], [[-1, 1, 3]], [[98, 98, 100], [79, 81, 80]], [[500, 6, 33]], [[1, 2, 3]], **[[14]]**, [[2]], [[1]], [[1]], [[2.0], [6.6573267908372973]])]] 

和打印出來繼續上。

有人可以向我解釋單元格陣列的排列方式嗎? (所以多少維度是上面?)

然後我有幾個問題: 1) 在這個單元陣列,還存在變數「標籤」,並分配給一個數組/細胞「座標」(我不知道哪個是實際使用的術語) - 粗體值。我想用Python編寫來訪問這個值。我應該怎麼做呢?

2) 爲了測試,我試過了 - >juncInfoF = a.get('juncForward_c'),當我嘗試打印juncInfoF時,它打印出'None'。爲什麼?我很困惑,因爲以前當我試過這個,它的工作原理。我甚至可以這樣做 - >print juncInfo[0][9][0][0]。但現在我甚至無法做到上述任何一項。

回答

1

我想象一下loadmat('file.mat')返回一個shelve類的實例,它是從dict類繼承的。我假設你使用scipy.io的loadmat函數?

from scipy.io import loadmat 

scipy doc只提到loadmat()返回一個字典,但我的猜測是,在你的榜樣返回的對象a是一個開放的貨架文件,當aclosed你不再能夠訪問其內容,除了手動呼叫a.close()之外,這可能有幾個原因。

爲了防止這種情況,所有的數據複製到一個真正的字典第一,加載此數據:

mat_dict = {} 
mat_dict.update(loadmat('file.mat')) 

現在你可以從mat_dict檢索所有鍵和值:

a = mat_dict['juncForward_c'] 
print(a.shape) # should work now 

注意,這隻要您正在測試並找出mat_dict數據的全部內容,就是一個有效的解決方案。在你的腳本/型號/功能,你會tipically加載所需的貨架字典的只是一部分,然後明確地關閉文件:

f = loadmat('file.mat') 
a = f['juncForward_c'] 
f.close() 

我不知道,如果with語句作品(擱置不支持它至今),你將不得不測試它,但它應該處理關閉即使當a裝載期間拋出一個異常:

with loadmat('file.mat') as f: 
    a = f['juncForward_c'] 

編輯:從numpy的數組子類添加額外的屬性

import numpy as np 

class MatArray(np.array): 
    def __init__(self, filepath): 
     f = loadmat(filepath) 
     np.array.__init__(self, f['juncForward_c']) 
     self.version = f['__version__'] 
     self.header = f['__header__'] 
     f.close() 

所以現在,如果你希望你的陣列類似matlab的結構,你這樣做:

>>> a = MatArray('myfile.mat') 
>>> a.header 
'MATLAB 5.0 MAT-file, Platform: PCWIN, Created on: Wed Sep 21 15:30:15 2011' 
>>> a.shape 

+0

嘿remi!非常感謝您的回答! 我也想問一下,如果字典會以任何方式保存原始的mat文件存儲結構。因爲根據將mat文件編碼出來的人,她告訴我matfile中的值是根據特定的結構存儲的。因此可以使用a.label來獲取標籤值。 我可以做到這一點使用python後,我已經加載.mat文件數據到python使用上面的方法?因爲我實際上嘗試過鍵入a.label,但它不允許我這樣做。 – user974666

+0

你可以創建你自己的類,並根據加載的字典中的鍵來分配它的屬性值。你有沒有嘗試過幫助(loadmat)?看起來struct_as_record關鍵字可以讓你感興趣。否則,發佈一個.mat文件的例子。 – Remi

+0

當我使用scipy.io.loadmat('file.mat')時返回的字典鍵是('_version _','1.0'),('_header _','MATLAB 5.0 ....'),('juncForward_c' ,array([[[[30.0],[[91.0],[87.0]],[[3.0]],[[2.2454534533.785785,5.4354]],...)]]等) dtype = object)),那麼我如何獲得ndarray中的屬性作爲它們的鍵值返回:juncForward_c?是否可以這樣我不能加載.mat文件? – user974666

0

如果你墊文件有與整數或字符串列表只電池陣列,我寫的一個通用的代碼。 例如,在MATLAB你可以做這樣的事情:

names = cell(1, N); 
indices = cell(1, N); 
for ind=1:N 
    names{ind} = *some_value*; 
    indices{ind} = *some_array*; 
save('names_and_indices.mat', 'names', 'indices'); 

Here你可以找到如何閱讀本蟒墊文件。