修剪节点不在networkx简单路径中?

时间:2015-11-07 18:34:16

标签: python graph networkx

我有DiGrraph并且我想修剪我指定的两个节点之间的simple paths之一中未包含的任何节点。 (考虑它的另一种方法是任何节点都不能 startend点应该被修剪。

我发现这样做的最好方法是获取all_simple_paths,然后使用这些来重建新图表,但我希望有一个更优雅,更不容易出错的解决方案。例如,有没有办法确定简单路径上的内容,然后删除这些节点?

2 个答案:

答案 0 :(得分:1)

您可以使用返回生成器的方法all_simple_paths,但您只需要第一条路径。然后,您可以使用G.subgraph(nbunch)从路径中返回诱导图。

编辑:返回由所有简单路径引起的子图,只连接all_simple_paths返回的唯一身份节点。

import networkx as nx
import itertools

G = nx.complete_graph(10) # or DiGraph, MultiGraph, MultiDiGraph, etc
# Concatenate all the paths and keep unique nodes (in one line)
all_path_nodes = set(itertools.chain(*list(nx.all_simple_paths(G, source=0, target=3))))
# Extract the induced subgraph from a given list of nodes
H = G.subgraph(all_path_nodes)
print(nx.info(H))

输出:

Name: complete_graph(10)
Type: Graph
Number of nodes: 10
Number of edges: 45
Average degree:   9.0000

答案 1 :(得分:0)

我确实在这方面取得了一些进展,而@kikohs正在努力理解我的问题并提供他的答案,所以我发布这个作为问题的替代解决方案。我认为他的答案虽然优越!

def _trim_branches(self, g, start, end):
    """Find all the paths from start to finish, and nuke any nodes that
    aren't in those paths.
    """
    good_nodes = set()
    for path in networkx.all_simple_paths(
            g,
            source=start,
            target=end):
        [good_nodes.add(n) for n in path]

    for node in g.nodes:
        if node not in good_nodes:
            g.remove_node(node)

    return g

使用subgraph进行第二次循环显然更好,就像他使用itertools.chain的单线程一样。今天围绕这些部分的好东西!