【问题标题】:Prune nodes not in networkx simple path?修剪不在networkx简单路径中的节点?
【发布时间】:2015-11-07 18:34:16
【问题描述】:

我有一个DiGrraph,我想在我指定的两个节点之间修剪不包含在simple paths 之一中的任何节点。 (另一种思考方式是,任何无法同时到达startend 点的节点都应该被修剪)。

我发现做到这一点的最佳方法是获取all_simple_paths,然后使用它们重建一个新图形,但我希望有一个更优雅且不易出错的解决方案。例如,有没有办法确定什么不在简单路径上,然后删除这些节点?

【问题讨论】:

  • 我不知道怎么做。但是all_simple_paths 返回一个生成器,所以你只需要使用 next(..) 来查询它。然后,如果您的图不将数据存储在节点上,则获取子图是单行的。
  • 你能扩展一下吗?我没有在节点上存储数据,但我不确定你在想什么单线。不过听起来很有希望!
  • 我会回复的。

标签: python graph networkx


【解决方案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

【讨论】:

  • 好的,我明白你的意思了,尽管我需要我的最终图表来包含任何简单路径中的所有节点。不过,我不知道 subgraph 函数,所以这很有用,但我认为它不会帮助我解决这个问题。
  • 你的问题不清楚,因为你说的是​​a简单路径。
  • 我改了答案看看。
  • 这个答案太棒了。我也在独立尝试想出一些东西(我不妨将其作为答案发布),但您的答案更加简洁,并且更智能地使用 networkx。非常感谢!
【解决方案2】:

当@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 也是如此。今天在这些部分周围有很棒的东西!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多