当节点之间存在路径时,当节点之间存在路径(可达性)时,我希望有一条边。
假设我有以下图表。
import networkx as nx
G=nx.DiGraph()
G.add_node(10, pr = 1)
G.add_node(20, pr = 2)
G.add_node(30, pr = 3)
G.add_node(40, pr = 2)
G.add_node(50, pr = 3)
G.add_node(60, pr = 1)
G.add_edges_from([(10,20),(10, 30),(10, 40),(10, 50),(20,30), (30,40), (40, 50), (50,60)])
nx.draw(G, with_labels = True, pos = nx.circular_layout(G),node_size =800)
我计划将下图作为输出。我想过滤具有属性(pr==1 和 pr==2)并忽略(pr==3)的节点。由于有一条从节点 10 到 40 的路径,我想在过滤过程中创建一条新边 (10, 40)。
这是我尝试的方法。
collector = nx.DiGraph()
for n1, atrr1 in G.nodes(data ='True'):
for n2, atrr2 in G.nodes(data ='True'):
if ((G.node[n1]['pr'] ==1) & (G.node[n1]['pr'] ==2)):
if (has_path(G,n1, n2)):
collector.add_edge(n1,n2)
if ((G.node[n1]['pr'] ==1) & (G.node[n2]['pr'] ==2)):
if (has_path(G,n1, n2)):
collector.add_edge(n1,n2)
if ((G.node[n2]['pr'] ==2) & (G.node[n2]['pr'] ==1)):
if (has_path(G,n1, n2)):
collector.add_edge(n1,n2)
nx.draw(collector, with_labels = True, pos = nx.spring_layout(collector))
plt.rcParams["figure.figsize"] = [6,6]
plt.axis('off')
plt.show()
看起来并不复杂,但我无法弄清楚。有人可以帮助我吗?
最佳答案
听起来你想计算 transitive closure你的图表。也就是说,图 G* 对输入图 G 进行建模,但如果节点之间存在路径,则节点之间还具有边。 Networkx 在输入图上提供此功能 transitive_closure(G) .
关于python - 如果节点之间存在路径,则在节点列表之间创建新边 - networkx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58861592/