【问题标题】:Accessing Data from .mat (version 8.1) structure in Python在 Python 中从 .mat(8.1 版)结构访问数据
【发布时间】:2014-04-28 22:49:10
【问题描述】:

我有一个 Matlab(.mat,版本 >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 数组等)?任何想法或指导将不胜感激。

【问题讨论】:

    标签: python arrays database matlab


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      我似乎无法复制您的代码。尝试打开使用表在 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,这可能会有所帮助。它递归地获取所有结构字段名称。

      【讨论】:

      • 这是我最初研究的。问题出在细则中:scipy.io.loadmat 不支持 8.1 版创建的 .mat 文件。支持的 matlab 最高版本是 7.3。请参阅本页底部的注释:docs.scipy.org/doc/scipy-0.13.0/reference/generated/…
      • 只是为了确定,您是否尝试过使用它?我已经将它与 7.14 和 8.0 版本的 mat 文件一起使用,并且没有遇到问题。但它们不是结构。
      • 抱歉,回复晚了。是的,我试过用它。没用。可能是结构有问题。
      猜你喜欢
      • 2020-03-22
      • 2012-10-17
      • 2012-09-18
      • 2021-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      • 2014-01-21
      相关资源
      最近更新 更多