使用scipy.io.loadmat在python中加载matlab表

时间:2014-09-15 17:48:18

标签: python matlab

是否可以使用scipy.io.loadmat?

在python中加载matlab表

我在做什么:

在Matlab中:

tab = table((1:500)')
save('tab.mat', 'tab')

在Python中:

import scipy.io
mat = scipy.io.loadmat('m:/tab.mat')

但是我无法使用mat ['tab']

访问Python中的表格选项卡

5 个答案:

答案 0 :(得分:2)

你的问题的答案是否定的。许多matlab对象都可以在python中加载。除其他外,无法加载表格。见Handle Data Returned from MATLAB to Python

答案 1 :(得分:1)

基于Jochens的回答,我提出了另一种对我有用的变体。 我编写了 Matlab脚本以自动准备m文件(请参见我的GitLab Repositroy和示例)。 它执行以下操作:

在Matlab中,课程table

与Jochens示例相同,但是将数据绑定在一起。因此,更容易加载多个变量。下一部分必须使用名称“表”和“列”。

YourVariableName = struct('table', struct(TableYouWantToLoad), 'columns', {struct(TableYouWantToLoad).varDim.labels})
save('YourFileName', 'YourVariableName')

在Matlab中,课程dataset

或者,如果必须处理旧的数据集类型。

YourVariableName = struct('table', struct(DatasetYouWantToLoad), 'columns', {get(DatasetYouWantToLoad,'VarNames')})
save('YourFileName', 'YourVariableName')

在Python中

import scipy.io as sio
mdata = sio.loadmat('YourFileName')
mtable = load_table_from_struct(mdata['YourVariableName'])

使用

import pandas as pd

def load_table_from_struct(table_structure) -> pd.DataFrame():

    # get prepared data structure
    data = table_structure[0, 0]['table']['data']
    # get prepared column names
    data_cols = [name[0] for name in table_structure[0, 0]['columns'][0]]

    # create dict out of original table
    table_dict = {}
    for colidx in range(len(data_cols)):
        table_dict[data_cols[colidx]] = [val[0] for val in data[0, 0][0, colidx]]

    return pd.DataFrame(table_dict)

它与加载文件无关,但基本上是Jochens Code的最小版本。因此,请给他的职位赞誉。

答案 2 :(得分:0)

正如其他人所提到的,目前这是不可能的,因为Matlab没有记录这种文件格式。人们正试图对文件格式进行逆向工程,但这是一项正在进行中的工作。

解决方法是将表格写入CSV格式并使用Python加载。表中的条目可以是可变长度数组,并且这些条目将在编号列之间拆分。我写了一个简短的函数来从这个CSV文件中加载标量和数组。

write the table to CSV in matlab:

sum

用Python阅读CSV文件:

writetable(table_name, filename)

答案 3 :(得分:0)

我已经针对正在研究的项目进行了研究,作为一种变通方法,您可以尝试以下操作。

在MATLAB中,首先将@table对象转换为结构,然后使用以下方法检索列名:

table_struct = struct(table_object);
table_columns = table_struct.varDim.labels;
save table_as_struct table_struct table_columns;

然后您可以在python中尝试以下代码:

import numpy
import pandas as pd
import scipy.io

# function to load table variable from MAT-file
def loadtablefrommat(matfilename, tablevarname, columnnamesvarname):
    """
    read a struct-ified table variable (and column names) from a MAT-file
    and return pandas.DataFrame object.
    """

    # load file
    mat = scipy.io.loadmat(matfilename)

    # get table (struct) variable
    tvar = mat.get(tablevarname)
    data_desc = mat.get(columnnamesvarname)
    types = tvar.dtype
    fieldnames = types.names

    # extract data (from table struct)
    data = None
    for idx in range(len(fieldnames)):
        if fieldnames[idx] == 'data':
            data = tvar[0][0][idx]
            break;

    # get number of columns and rows
    numcols = data.shape[1]
    numrows = data[0, 0].shape[0]

    # and get column headers as a list (array)
    data_cols = []
    for idx in range(numcols):
        data_cols.append(data_desc[0, idx][0])

    # create dict out of original table
    table_dict = {}
    for colidx in range(numcols):
        rowvals = []
        for rowidx in range(numrows):
            rowval = data[0,colidx][rowidx][0]
            if type(rowval) == numpy.ndarray and rowval.size > 0:
                rowvals.append(rowval[0])
            else:
                rowvals.append(rowval)
        table_dict[data_cols[colidx]] = rowvals
    return pd.DataFrame(table_dict)

答案 4 :(得分:0)

loadmat函数不会加载MATLAB表。而是可以执行一个小的解决方法。可以将表另存为.csv文件,然后可以使用pandas读取。

在MATLAB中

writetable(table_name, file_name)

在Python中

df = pd.read_csv(file_name)

最后,DataFrame df将具有table_name的内容