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