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

从Python中的.mat(版本8.1)结构访问数据,python,arrays,database,matlab,Python,Arrays,Database,Matlab,我有一个Matlab(.mat,version>7.3)文件,其中包含一个本身包含许多字段的结构(数据)。每个字段都是一个单列数组。每个字段代表一个单独的传感器,阵列是时间序列数据。我试图用Python打开这个文件来做更多的分析。我正在使用PyTables读取以下文件中的数据: import tables impdat = tables.openFile('data_file.mat') 这会在中读取文件,我可以输入fileObject并使用以下命令获取每个字段的名称: impdat.root

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

import tables
impdat = tables.openFile('data_file.mat')
这会在中读取文件,我可以输入fileObject并使用以下命令获取每个字段的名称:

impdat.root.data.__members__
这将打印字段列表:

['rdg','freqlabels','freqbinsctr',…]

现在,我想要的是一个方法来获取数据中的每个字段,并生成一个python变量(可能是dictionary),其中字段名作为键(如果是dictionary),相应的数组作为其值。我可以通过执行以下操作查看阵列的大小,例如:

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)

我的问题是如何访问存储在这个大数组(11286920)中的一些数据。如何将该数组读入另一个Python变量(list、dictionary、numpy数组等)?如有任何想法或指导,将不胜感激

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

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

根据尝试访问的数据的结构,“[0]”可能是多余的。在我的例子中,数据存储在一个数组的数组中,我只需要第一个数组。如果你有更好的解决方案,请随时分享

我似乎无法复制您的代码。尝试打开我在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

不确定正在使用的数据集的大小。如果它很大,我肯定我能想出一个脚本来把字段从结构中拉出来。我确实找到了可能有用的方法。它递归地获取所有结构字段名

这就是我最初研究的。问题在于细节:scipy.io.loadmat不支持由版本8.1创建的.mat文件。支持的matlab的最高版本是7.3。请参阅本页底部的注释:请确定,您是否尝试过使用它?我使用了7.14和8.0版本的mat文件,没有遇到问题。但它们不是结构。抱歉,回复太晚了。是的,我试过用它。没用。可能是结构有问题。