MATLAB结构转换成python
我有一个.mat文件,其结构为1x4349,有6个字段。第一列标记为“A”,每个单元格是一个大小不同的方形矩阵(即17x17、18x18等)。问题是,如何将matlab结构转换为可用的python数据?没有使用matlab.engine,我只有pandas、numpy和scipy.io。我可以使用loadmat导入数据。我最终想获取这些数据 将其导入tensorflowMATLAB结构转换成python,python,matlab,numpy,tensorflow,scipy,Python,Matlab,Numpy,Tensorflow,Scipy,我有一个.mat文件,其结构为1x4349,有6个字段。第一列标记为“A”,每个单元格是一个大小不同的方形矩阵(即17x17、18x18等)。问题是,如何将matlab结构转换为可用的python数据?没有使用matlab.engine,我只有pandas、numpy和scipy.io。我可以使用loadmat导入数据。我最终想获取这些数据 将其导入tensorflow from scipy.io import loadmat import tensorflow as tf data = lo
from scipy.io import loadmat
import tensorflow as tf
data = loadmat('.../template1-lib5-eqns-CR-RESULTS-SET1-FINAL.mat')
nz = data['Graphs']['nz']
A = data['Graphs']['A']
print(nz[:,1])
print(A[:,1])
Graphs是结构,nz是列,单元格1应该返回数字6,但我得到的是[array([[6]],dtype=uint8)]
打印一张照片会给我:
[array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0]],
dtype=uint8)]
如果您需要更多信息,请告诉我。谢谢。我所要做的就是将所有内容上传到熊猫数据框中
raw_data = loadmat(path, squeeze_me=True)
data = raw_data['Graphs']
graph_labels = pd.DataFrame()
graph_labels['perf'] = raw_data['Objective'][0:1000]
graph_labels['np'] = data['np'][0:1000]
这完成了任务,使matlab中的所有内容都可用。看起来
loadmat
为您提供了一个有效的numpy
数组。什么是data['Graphs']
shape
和dtype
?数据都在那里,你只需要学会如何找到它。例如,在MATLAB中,一切都是2d,甚至“标量”都是(1,1)形状。它说它的形状是(143249)使用:'data['Graphs'].shape'至于dtype,我使用了data['Graphs'].dtype,它返回:[('A','O'),('Ln','O'),('transferFunc','O'),('types','O'),('nz','O'),('np和'O')],所以所有字段的dtype都是'O',object。这意味着nz[:,1]
是(在repr显示中)np.array([array([[6]],dtype=uint8)],dtype=object)
。什么是nz[0:,1]
,在行和列上都选择?这些字段是包含数组(其本身可能是2d(1,1))的对象数据类型数组。你只需要深入到结构中,边做索引。print(数据['Graphs']['nz'][0:,1]给出[array([[6]],dtype=uint8)]Oops,删除:,nz[0,1]
。你想索引(14349)形状数组的一项。np.vstack(nz[0,:])
可能会产生一个(439,1,1)数组。或者(43249,)与另一个[:,0,0]索引层。