首页 > 解决方案 > 边缘去除networkx图时如何保留路径

问题描述

当我过滤networkx图中的特定节点时,我想保留路径。假设我有以下图表。

在此处输入图像描述

当我删除节点 20时,我想保留与下一个节点的路径或连接,因为存在通过节点 20 的连接。

我想拥有以下内容。

在此处输入图像描述

任何人都可以帮助我使用 python 来应对这个挑战吗?

标签: pythongraphnetworkx

解决方案


对于有向图,您可以使用 获取与节点相关的所有边,使用 获取g.in_edges(node)所有传出边g.out_edges(node)。一旦你有了这些,连接来自入射边缘的源和来自传出边缘的目标就很简单了。无向图没有传入和传出边的概念,因此您只需组合邻居 ( g.neighbors)。最后,您删除您的节点。

在此处输入图像描述

#!/usr/bin/env python
"""
Remove a node from a network while maintaining all paths.
"""
import itertools
import matplotlib.pyplot as plt
import networkx as nx

def remove_node(g, node):
    if g.is_directed():
        sources = [source for source, _ in g.in_edges(node)]
        targets = [target for _, target in g.out_edges(node)]
    else:
        sources = g.neighbors(node)
        targets = g.neighbors(node)

    new_edges = itertools.product(sources, targets)
    new_edges = [(source, target) for source, target in new_edges if source != target] # remove self-loops
    g.add_edges_from(new_edges)

    g.remove_node(node)

    return g

if __name__ == '__main__':

    edges = [(10, 20), (20, 30), (30, 40)]
    g = nx.DiGraph()
    g.add_edges_from(edges)

    fig, (ax1, ax2) = plt.subplots(1, 2)
    nx.draw_networkx(g, with_labels=True, ax=ax1)

    g = remove_node(g, 20)

    nx.draw_networkx(g, with_labels=True, ax=ax2)
    plt.show()

推荐阅读