【问题标题】:Open .mat (matlab data) using python使用python打开.mat(matlab数据)
【发布时间】:2018-10-21 13:39:49
【问题描述】:

全部,

我尝试从 python 导入和读取 .mat 文件。我尝试了两种方法,但都不成功:

方法一: 在python中:

 import scipy.io as sio    
mat = sio.loadmat('path/tmpPBworkspace.mat')

我收到类似于以下内容的消息:

{'None': MatlabOpaque([ (b'rateQualityOutTrim', b'MCOS', b'dataset', array([[3707764736],
        [         2],
        [         1],
        [         1],
        [         1],
        [         1]], dtype=uint32))],
              dtype=[('s0', 'O'), ('s1', 'O'), ('s2', 'O'), ('arr', 'O')]),
 '__function_workspace__': array([[ 0,  1, 73, ...,  0,  0,  0]], dtype=uint8),
 '__globals__': [],
 '__header__': b'MATLAB 5.0 MAT-file, Platform: GLNXA64, Created on: Thu May 10 07:11:52 2018',
 '__version__': '1.0'}

我不确定那里出了什么问题?我希望看到一个数据框

还要补充一点,在方法 1 中,我已将 .mat 保存在与 scipy 兼容的版本中

在 Matlab 中

save('path/tmpPBworkspace.mat','rateQualityOutTrim','-v7')

也尝试了另一种方式:

方法二:h5py

在 Matlab 中:

save('path/tmpPBworkspaceH5.mat','rateQualityOutTrim','-v7.3')

在 Python 中:

import numpy as np
import h5py
f = h5py.File('/GAAR/ustr/projects/PBF/tmpPBworkspaceH5.mat','r')
data = f.get('rateQualityOutTrim/date')
data = np.array(data)

我明白了

f
Out[154]: <HDF5 file "tmpPBworkspaceH5.mat" (mode r)>

data
array(None, dtype=object)

数组为空。不知道如何在这里访问数据

谢谢

【问题讨论】:

  • 不透明项是一个matlab类对象,它不能变成一个numpy数组。
  • 感谢 hpaulj 关于如何阅读 .mat 的任何想法?
  • 什么是matlab对象?
  • 什么意思?
  • 我不关心 MATLAB 中的数据集,也不关心它们是否与 pandas 兼容。但是要使用loadmat 加载变量,您必须编写矩阵、单元格或结构体。

标签: python-3.x pandas numpy dataframe scipy


【解决方案1】:

我也会尝试使用 scipy.io:

我有一个 Matlab“结构”(Auslage_000.mat),我将其理解为某种嵌套字典。它有几个标题信息和三个数据通道(振动数据)。我还发现 spyder(Python 开发环境)很有帮助,因为一旦加载数据,您就可以通过变量管理器访问数据(类似于 Matlab)。

import scipy.io as sio

mat_contents = sio.loadmat('Auslage_000.mat',squeeze_me=True,struct_as_record=False)

当我检查变量“mat_contends”的输出时,我得到了

mat_contents

Out[14]: 
{'__header__': b'MATLAB 5.0 MAT-file, Platform: PCWIN, Created on 2019-08-14 13:14:56 by TiePie software (www.tiepie.com).',
 '__version__': '1.0',
 '__globals__': [],
 'tpd': <scipy.io.matlab.mio5_params.mat_struct at 0x1ea3441d438>}

我的实际数据在“tpd”中。我可以进一步访问数据如下:

#Access the data via the key 'tpd' and then the attribute 'Data'
# -> Data is a numpy array with 3 channels (ch1, ch2, ch3) / dimensions
Data = mat_contents['tpd'].Data

# extract channel1 

ch1 = Data[0]

我想你必须先挖掘一下,因为首先你的 Matlab 文件中有“键”和“属性”(如果它是一个结构)

【讨论】:

    【解决方案2】:

    您可以为此使用scipy.io.loadmat

    from scipy import io
    
    loaded = io.loadmat('/GAAR/ustr/projects/PBF/tmpPBworkspaceH5.mat')
    

    loaded 将是一个将名称映射到数组的字典。


    但是,如果您同时控制 Matlab 部分和 Pandas 部分,则使用 csvwrite 会容易得多:

    在 Matlab 中:

    csvwrite('path/tmpPBworkspaceH5.csv','rateQualityOutTrim')
    

    在 Python 中:

    pd.read_csv('tmpPBworkspaceH5.csv')
    

    【讨论】:

    • 谢谢阿米·塔沃里。我这样做了,我收到了与以前类似的消息{'None': MatlabOpaque([ (b'rateQualityOutTrim', b'MCOS', b'dataset', array([[3707764736], [ 2], [ 1], [ 1], [ 1], [ 1]], dtype=uint32))], dtype=[('s0', 'O'), ('s1', 'O'), ('s2', 'O'), ('arr', 'O')]), '__function_workspace__': array([[ 0, 1, 73, ..., 0, 0, 0]], dtype=uint8), '__globals__': [], '__header__': b'MATLAB 5.0 MAT-file, Platform: GLNXA64, Created on: Fri May 11 03:33:35 2018', '__version__': '1.0'}
    • 仍然不确定如何提取数据?
    • @SBad 知道了 - this notebook 很好地解释了这一点 - 它在 Julia 中,但你可以按照解释进行。
    • @SBad 顺便说一句,看看您的问题,您似乎也可以控制 Matlab 部分。在这种情况下,有更简单的选择。我编辑了我的答案以包含一个。
    • @SBad 这是一个很长的答案,因为这种格式实际上并不打算用于导出 - 它是逆向工程的,你可能不想一开始就写进去。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    • 2023-03-25
    • 2018-11-04
    • 2014-11-06
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    相关资源
    最近更新 更多