I have the following two isomorphic graphs with different edge labels:
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)
I use nx.isomorphism
to find the correct mapping between the nodes:
GM = isomorphism.GraphMatcher(G1, G2)
GM.is_isomorphic()
print(GM.mapping)
>>> {1: 11, 2: 12, 3: 13, 4: 14}
There is no built-in way to directly get the mapping between the edges. What is the most efficient way to get a dictionary between the edge labels?
{'Albert': 'Alice', 'Bob': 'Barbara', 'Cole': 'Cathrine', 'Dan': 'Delia'}
Many thanks for all suggestions!
Here is an answer inspired by @J_H's comment.
Let's relabel the nodes of G1 to match the names of G2:
node_map = GM.mapping
G1b = nx.relabel_nodes(G1, node_map)
Create EdgeView objects for the two graphs. Through these, the edge lables can be accessed.
e1 = G1b.edges()
e2 = G2.edges()
Now eg with a list comprehension we obtain the desired output:
[(e2[j]['label'], e1[j]['label']) for j in list(e1)]
<<< [('Alice', 'Albert'),
<<< ('Barbara', 'Bob'),
<<< ('Delia', 'Dan'),
<<< ('Cathrine', 'Cole')]