【问题标题】:UpStream and DownStream of Nodes in NetworkXNetworkX中节点的上下游
【发布时间】:2020-01-30 20:23:04
【问题描述】:

我是 Python 中 Networkx 的新手。我正在尝试选择一个节点并获取该节点上游和下游的所有节点。例如下图中,对于上游节点 2,我要返回节点 1、6 和 7。对于下游节点 2,我要返回 3、4、8、9、5。输出的顺序节点无所谓。有没有一种快速的方法可以将它们作为列表返回?

【问题讨论】:

  • 给定一个节点,如何定义其他节点哪些是上游,哪些是下游?
  • 好问题。我有一个根节点,我知道它在图中的位置。我从给定节点调用上游到根节点,并从给定节点调用下游到另一个方向。这有帮助吗?
  • 是有向图吗?有周期吗?
  • 它是一个无向图。所以,“从”“到”的顺序搞砸了。将其转换为有向图并非易事。
  • 有周期吗?

标签: python graph networkx


【解决方案1】:

我假设上游/下游,这是一个有向图,您的意思是传入/传出边及其父/子?您可以使用广度优先树搜索 (bfs_tree)。

见:https://networkx.github.io/documentation/stable/reference/algorithms/traversal.html

例子:

g = nx.DiGraph()
g.add_edges_from([
    (7,6), 
    (6,2), 
    (6,1), 
    (1,2), 
    (2,4), 
    (2,3), 
    (3,4), 
    (4,8), 
    (4,9),
    (3,5)
])

upstream = [n for n in nx.traversal.bfs_tree(g, 2, reverse=True) if n != 2]
downstream = [n for n in nx.traversal.bfs_tree(g, 2) if n != 2]

但如果我有误解,那么您需要澄清上游/下游的含义,因为您显示的图表看起来没有方向。

【讨论】:

  • 谢谢丹。我尝试了遍历功能,但它对我不起作用。主要原因是我的图不是有向图。所以,节点“From”“To”的顺序是混乱的。我试图将其视为无向图。
  • 如果你的图是无向的,那么就没有上游/下游的概念,除非有特定的节点属性告诉你。在这种情况下,请使用广度优先搜索。
  • 我知道根节点。这有助于定义上游和下游。解决就够了吗?
  • 如果它是一个无环图并且你知道根节点,你可以这样定义方向。如果有循环,除非你能以另一种方式构建有向图,否则你就不走运了。遍历您的图表并将其构建为有向图,这可能会得到您正在寻找的内容,但如果没有图表本身的更多细节,我无法告诉您。您可以使用这些函数来查找循环:networkx.github.io/documentation/stable/reference/algorithms/…
  • 谢谢你,丹,让我复习一下。我会及时通知你。
猜你喜欢
  • 2013-02-26
  • 2016-09-15
  • 2014-09-13
  • 2013-05-10
  • 2020-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多