【问题标题】:get ordered nodes in components of directed acyclic networkx DiGraph获取有向无环网络x有向图组件中的有序节点
【发布时间】:2015-12-14 01:47:51
【问题描述】:

我有一个带有子图的有向图,其中节点的顺序很重要。

例如我的图有两个子图,都是线性的 1-->2-->3 & 9-->8-->7-->6

注意:节点名称将是随机且唯一的,图中没有循环

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

我需要获取子图或子图中的节点列表,其中节点根据它们的连接排序。

我试过了

[i.nodes() for i in list(nx.weakly_connected_component_subgraphs(NG))]

产生节点列表列表,几乎正确,但未根据它们的连接排序:

[[1, 2, 3], [8, 9, 6, 7]]

我需要如何继续获取有序节点列表的列表。即:

[[1, 2, 3], [9, 8, 7, 6]]

【问题讨论】:

  • 我编辑了您的标题以更贴近问题。请检查是否正常。

标签: python networkx directed-graph


【解决方案1】:

我假设您确定这些是“有向无环图”。

然后nx.topological_sort(G)根据你想要的顺序对图中的节点进行排序:也就是说,如果u出现在v之前,这意味着没有从vu的路径(但可能从uv 的路径)。如果你使用nx.weakly_connected_component_subgraphs(G),你会得到你感兴趣的子图的生成器。所以我推荐的方法是先找到子图,然后对节点进行排序。

[nx.topological_sort(H) for H in nx.weakly_connected_component_subgraphs(NG)]

应该得到你想要的。


另一种更有效的方法:

前面的代码可能不是最有效的代码,但它很简单。创建每个子图H 需要一些可以避免的时间。更有效的方法是weakly_connected_components(NG)(它生成每个子图中的节点列表,而不是子图本身)。这将创建您已经拥有的列表。然后进行拓扑排序:

[nx.topological_sort(NG, nbunch=subgraph_nodes) for subgraph_nodes in nx.weakly_connected_components(NG)]

这样会更有效率。它首先会生成每个组件中的节点列表。然后对每个组件中的节点进行排序。如果你这样做,你应该看看source for topological_sort。它将返回从它nbunch 的任何节点可访问的所有节点的排序列表。在您的情况下,这只是 nbunch,但更一般地说,它不仅必须返回 nbunch


注意:在您的代码中不需要list(...)。没有它你会得到同样的结果。

【讨论】:

  • 谢谢,这确实是我打算做的。我 100% 确定每个子图都是 DAG,节点代表线性空间中物理分离的对象。循环或分支是不可能的
猜你喜欢
  • 1970-01-01
  • 2021-06-09
  • 2020-10-06
  • 2014-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多