python - 如果节点之间存在路径,则在节点列表之间创建新边 - networkx

标签 python graph networkx

当节点之间存在路径时,当节点之间存在路径(可达性)时,我希望有一条边。

假设我有以下图表。

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)

enter image description here

我计划将下图作为输出。我想过滤具有属性(pr==1 和 pr==2)并忽略(pr==3)的节点。由于有一条从节点 10 到 40 的路径,我想在过滤过程中创建一条新边 (10, 40)。

enter image description here

这是我尝试的方法。

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/

相关文章:

Linux shell 中的 python 导出环境变量

python - 添加来自两个不同数据帧的两列,所有其他列都相同

python - matplotlib 中的事件连接和子图

java - 将图表存储在数据库中

graph - Networkx PageRank - 不同权重的同等排名

python - 如何从 Networkx 或 DyNetx 上的图表列表生成动态图表

python - 带有 csv 输入和绘图输出的 networkx 图

python - 在 Dash 中构建仪表板

android - 用于 C/C++ 的路径线绘图图形库/引擎?

python - 使用 K-D 树的 NetworkX 随机几何图实现