(De)从Python

时间:2015-12-18 16:45:59

标签: matlab python-2.7 serialization graph deserialization

MATLAB代表directed/undirected graph。我想通过MATLAB的save函数将具有许多节点和边缘属性序列化的图形反序列化为Python。我知道scipy.io.loadmath5py's File(对于MATLAB v7.3 save d文件),但似乎都没有在Python中生成实际上包含可理解的顶点/边缘数据的表示。

我该怎么做?我关注这个和逆操作,即从Python写一个对象到MATLAB load格式可以读取。是否有序列化MATLAB对象的字节数据描述和/或图形在某处?

例如,在MATLAB中我可以:

s = [1 1 2 2 3];
t = [2 4 3 4 4];
G = digraph(s,t);
G.Edges.Rand = rand(size(G.Edges)); % Add an edge attribute
G.Nodes.Val = rand(size(G.Nodes)); % Add a node attribute

save('loadmat.mat', 'G'); % Readable by scipy.io.loadmat
save('h5py.mat', 'G', '-v7.3'); % Readable by h5py.File

然后,在Python中我可以阅读这些

from scipy.io import loadmat
G0 = loadmat('loadmat.mat')

from h5py import File
G1 = File('h5py.mat')

似乎没有给我顶点/边缘数据或者我只是错过了它?

由于

1 个答案:

答案 0 :(得分:0)

digraph对象是用户定义的对象类型,而不是基本的MATLAB类型之一;难怪python不理解它。请注意,如果没有保存对象类的工作定义,即使在路径中可以访问,MATLAB也不会理解保存的对象布局。

您可能希望保存邻接矩阵:

A = full(adjacency(G));
save('adjacency.mat', 'A');

或关联矩阵:

I = full(incidence(G));
save('incidence.mat', 'I');

最适合你的。

延迟修改

另一种方法是强制对象成为POD(普通旧数据),loadmat有更好的机会被理解:

S = struct(G);
save('pod_digraph.mat', 'S');

但请注意,您可以访问所有信息;依赖属性将被保存;你需要自己重新创建类的接口以保持一致性(例如,邻接矩阵和关联矩阵都可以在相同的内部信息中即时构建,这可能看起来都不像它们)。此外,除非构造函数知道如何执行此操作,否则无法将POD转换为原始对象。