我有两个具有不同边缘标签的同构图:
G1 = nx.Graph()
G1.add_edges_from([(1,2), (2,3), (3,4), (4,2)])
attrs1 = {(1, 2): {'label': 'Albert'}, (2, 3): {'label': 'Bob'}, (3, 4): {'label': 'Cole'}, (4, 2): {'label': 'Dan'}}
nx.set_edge_attributes(G1, attrs1)
G2 = nx.Graph()
G2.add_edges_from([(13,14), (12,13), (11,12), (14,12)])
attrs2 = {(11, 12): {'label': 'Alice'}, (12, 13): {'label': 'Barbara'}, (13, 14): {'label': 'Cathrine'}, (14, 12): {'label': 'Delia'}}
nx.set_edge_attributes(G2, attrs2)我使用nx.isomorphism查找节点之间的正确映射()。
GM = isomorphism.GraphMatcher(G1, G2)
GM.is_isomorphic()
print(GM.mapping)
>>> {1: 11, 2: 12, 3: 13, 4: 14}没有内置的方法可以直接获得边缘之间的映射。在边缘标签之间获取字典最有效的方法是什么?
{'Albert': 'Alice', 'Bob': 'Barbara', 'Cole': 'Cathrine', 'Dan': 'Delia'}非常感谢大家的建议!
发布于 2022-08-19 19:53:44
以下是@J_H的评论所启发的答案。
让我们重新命名G1的节点,以匹配G2的名称:
node_map = GM.mapping
G1b = nx.relabel_nodes(G1, node_map)为这两个图创建EdgeView对象。通过这些,可以访问边缘标签。
e1 = G1b.edges()
e2 = G2.edges()现在,通过对列表的理解,我们获得了期望的输出:
[(e2[j]['label'], e1[j]['label']) for j in list(e1)]
<<< [('Alice', 'Albert'),
<<< ('Barbara', 'Bob'),
<<< ('Delia', 'Dan'),
<<< ('Cathrine', 'Cole')]发布于 2022-08-19 19:08:04
LOOP E over edges in G1
GET v1,v2 the nodes connected by E
GET v1g2,v2g2 the isomorphic vertices in G2 if v1,v2
GET Eg2 the edge between v1g2,v2g2 in G2
LABEL Eg2 with E's labelhttps://stackoverflow.com/questions/73420908
复制相似问题