在Python中访问.mat(版本8.1)结构中的数据
我有一个Matlab文件(.mat,版本大于7.3),里面包含一个结构体(data),这个结构体里有很多字段。每个字段都是一个单列数组,每个字段代表一个独立的传感器,而数组则是时间序列数据。我想在Python中打开这个文件,进行进一步的分析。我正在使用PyTables来读取数据:
import tables
impdat = tables.openFile('data_file.mat')
这段代码可以读取文件,我可以进入fileObject并通过以下方式获取每个字段的名称:
impdat.root.data.__members__
这会打印出字段的列表:
['rdg', 'freqlabels', 'freqbinsctr',... ]
现在,我想要一个方法,把data中的每个字段变成一个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 个回答
我好像无法复现你的代码。当我尝试打开我在8.0版本中用表格创建的文件时,出现了错误。
你可以试试把结构体里的变量提取出来,保存到一个新的mat文件中,这个文件只包含一组变量。这样处理起来会简单很多,而且这个问题已经在这里得到了很好的解答。
文中提到,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
我不太确定你正在处理的数据集有多大。如果数据集很大,我相信我可以写个脚本来提取结构体中的字段。我找到了一款这个工具,可能会对你有帮助。它可以递归地获取所有结构体字段的名称。
我想出了一个可行的解决办法。虽然这个方法不是特别优雅,因为它需要用到eval。首先,我创建了一个新的变量(alldata),用来存放我想要访问的数据。接着,我创建了一个空的字典(datastruct),然后我遍历所有的数据成员,把数组分配到字典中对应的键里:
alldata = impdat.root.data
datastruct = {}
for names in impdat.rood.data.__members___:
datastruct[names] = eval('alldata.' + names + '[0][:]')
这里的'[0]'可能是多余的,具体要看你想访问的数据结构。在我的情况下,数据是存放在一个数组里的数组中,我只想要第一个。如果你有更好的解决办法,欢迎分享。