简体   繁体   中英

Convert BiDirectional Graph Edges to Undirected Edges in NetworkX

I am using NetworkX to do the following: I have a directed graph g that I want to transform into an undirected graph h such that h has the same nodes as g and e is an edge in h iff e is bidirectional in g . For example, I want to transform:

import networkx as nx
g = nx.DiGraph([("A", "B"), ("B", "A"), ("A", "C"), ("C", "A"), ("B", "C"), ("C", "B"), ("A", "D"), ("C", "D"), ("B", "E"), ("C", "E")])

有向图

into

h = nx.Graph([("A", "B"), ("A", "C"), ("B", "C")])
h.add_nodes_from(["D", "E"])

无向图

What f(g) = h should I write in NetworkX? I think it's some combination of graph views and filters, but I'm new to NetworkX so I'm not sure exactly what.

You can achieve that by iterating over the edges of you directed graph and checking if the reverse edge exist with the condition if edge[::-1] in g.edges(): . If the reverse edge exist, just add it your graph. See code below:

import networkx as nx
import matplotlib.pyplot as plt

#Creating directed graph
g = nx.DiGraph([("A", "B"), ("B", "A"), ("A", "C"), ("C", "A"), ("B", "C"), ("C", "B"), ("A", "D"), ("C", "D"), ("B", "E"), ("C", "E")])

#Creating undirected graph
h=nx.Graph()
h.add_nodes_from(g)

for edge in g.edges():  
  if edge[::-1] in g.edges(): #check if reverse edge exist in graph
    h.add_edge(edge[0],edge[1])

#plot both graphs
fig=plt.figure(figsize=(15,6))
plt.subplot(121)
plt.title('Directed graph')
pos1=nx.circular_layout(g)
nx.draw(g,pos=pos1,with_labels=True, node_color='tab:orange')

plt.subplot(122)
plt.title('Undirected graph')
pos2=nx.circular_layout(h)
nx.draw(h,pos=pos2,with_labels=True, node_color='tab:green')

And the output gives:

在此处输入图像描述

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM