是否可以使用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中的表格选项卡答案 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
的内容