我正在解析Python中的Matlab結構化數組。爲了簡單起見,數據結構最終由3個字段組成,比如標題,正文,預告片。在Matlab中創建一些數據,例如:numpy嵌套結構化數組字段訪問
header_data = {100, 100, 100};
body_data = {1234, 100, 4321};
trailer_data = {1001, 1001, 1001};
data = struct('header', header_data, 'body', body_data, 'trailer', trailer_data);
產生一個1x3結構數組。
該數據然後在Python內容如下:
import scipy.io as sio
import numpy as np
matlab_data = sio.loadmat('data.mat', squeeze_me=True)
data = matlab['data']
這使得data
尺寸3的1維numpy.ndarray
與dtype=dtype([('header', 'O'), ('body', 'O'), ('trailer', 'O')])
,我可以愉快地遍歷使用numpy.nditer
並提取和分析數據從每個結構。
我試圖克服的問題是,不幸的是(在我的控制之外)在一些我需要解析的文件中,上面定義的結構數組本身是另一個結構數組的成員,其字段爲msg
。與我在Matlab示例繼續:當該在Python裝有scipy.loadmat
messages = struct('msg', {data(1), data(2), data(3)});
,它導致尺寸3的1維numpy.ndarray
與dtype=dtype([('msg', 'O')])
。爲了重用相同的函數來解析數據字段,我需要邏輯來檢測msg
字段(如果存在),然後在調用函數解析單個標題,正文和預告片之前從中提取每個numpy.void
領域。
在Matlab中,這是很容易克服,因爲帶有三個字段的原始1×3結構陣列可以從1×3結構陣列與單msg
字段通過執行來提取:[messages.msg]
,這產生一個1×3結構陣列與標題,正文和拖車領域。如果我試圖將其翻譯爲numpy,下面的命令會給我一個原始的numpy.ndarray
的視圖,它不是一個結構(dtype=dtype('O')
)。
我試圖找出是否存在與numpy
類似的方式來恢復具有單個msg
字段的三個字段的結構數組,如我可以在Matlab中做的,或者如果我真的需要迭代每個值並在使用常用解析函數之前從msg
字段中手動提取它。再次,Matlab輸入文件的格式超出了我的控制範圍,我無法更改它們;和我需要從Matlab數據中提取的嵌套字段的數量相比,這裏的示例只是微不足道的。
它看起來像會工作。我嘗試用'squeeze_me = True'加載Matlab數據,因爲我能夠使用'[()]'提取值,這似乎比'[0,0]'更加微不足道,因爲它們不再存儲爲1x1數組,但這一切都讓我感到滿意。 – TWReever