在Python中从.mat(版本8.1)结构访问数据

时间:2014-04-18 17:19:30

标签: python arrays database matlab

我有一个Matlab(.mat,version> 7.3)文件,其中包含一个本身包含许多字段的结构(数据)。每个字段都是单列数组。每个字段代表一个单独的传感器,阵列是时间序列数据。我试图用Python打开这个文件来做更多的分析。我正在使用PyTables来读取数据:

import tables
impdat = tables.openFile('data_file.mat')

这将读入文件,我可以输入fileObject并使用以下命令获取每个字段的名称:

impdat.root.data.__members__

这将打印字段列表:

  

['rdg','freqlabels','freqbinsctr',...]

现在,我想要的是一个方法来获取数据中的每个字段并使用字段名称作为键(如果它是字典)并将相应的数组作为其值来创建python变量(可能是字典)。我可以看到数组的大小,例如:

impdat.root.data.rdg

返回:

/data/rdg (EArray(1, 1286920), zlib(3))
atom := Int32Atom(shape=(), dflt=0)
maindim := 0
flavor := 'numpy'
byteorder := 'little'
chunkshape := (1, 16290)

我的问题是如何访问存储在该大型数组中的一些数据(1,1286920)。如何将该数组读入另一个Python变量(列表,字典,numpy数组等)?任何想法或指导将不胜感激。

2 个答案:

答案 0 :(得分:0)

我想出了一个有效的解决方案。它不是很优雅,因为它需要一个评估。所以我首先为我想要访问的数据创建一个新变量(alldata),然后创建一个空字典数据结构,然后循环遍历所有数据成员并将数组分配给字典中的相应键:

alldata = impdat.root.data
datastruct = {}
for names in impdat.rood.data.__members___:
    datastruct[names] = eval('alldata.' + names + '[0][:]')

'[0]'可能是多余的,具体取决于尝试访问的数据结构。在我的情况下,数据存储在一个数组的数组中,我只想要第一个。如果您想出更好的解决方案,请随时分享。

答案 1 :(得分:0)

我似乎无法复制您的代码。尝试使用表打开我在8.0中创建的文件时出错。

如果您在结构中获取变量并将它们保存到仅包含变量集合的新mat文件中,该怎么办?这样可以更容易处理,而且已经得到了很好的回答here

其中声明作为数组的mat文件只是hdf5文件,可以通过以下方式读取:

import numpy as np, h5py 
f = h5py.File('somefile.mat','r') 
data = f.get('data/variable1') 
data = np.array(data) # For converting to numpy array

不确定您正在使用的数据集的大小。如果它很大,我相信我可以拿出一个脚本来将字段拉出结构。我找到this tool可能会有所帮助。它以递归方式获取所有结构字段名称。