编程语言
首页 > 编程语言> > python-在有向无环网络x DiGraph中获取有序节点

python-在有向无环网络x DiGraph中获取有序节点

作者:互联网

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

示例我的图将有两个子图,所有子图都是线性的
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]]

解决方法:

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

然后nx.topological_sort(G)根据您想要的顺序对图中的节点进行排序:也就是说,如果u出现在v之前,则意味着从v到u没有路径(但可能是从u到v的路径).如果使用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.

注意:在您的代码中,不需要list(…).没有它,您将得到相同的结果.

标签:directed-graph,networkx,python
来源: https://codeday.me/bug/20191119/2038309.html