在networkx(Python)中获取有向图的根(头)

Posted

技术标签:

【中文标题】在networkx(Python)中获取有向图的根(头)【英文标题】:Getting the root (head) of a DiGraph in networkx (Python) 【发布时间】:2011-05-06 13:29:57 【问题描述】:

我正在尝试使用networkx 在项目中做一些图形表示,但我不确定如何做一些应该简单的事情。我创建了一个带有一堆节点和边的有向图,因此该图中只有一个根元素。现在,我想做的是从根开始,然后遍历每个元素的子元素并从中提取一些信息。如何获取此有向图的根元素?

所以应该是这样的:

#This is NOT real code, just pseudopython to convey the general intent of what I'd like to do

    root = myDiGraph.root()
    for child in root.children():
        iterateThroughChildren(child)

def iterateThroughChildren(parent):
    if parent.hasNoChildren(): return
    for child in parent.children():
        //do something
        //
        iterateThroughChildren(child)

我在文档中没有看到任何建议一种简单的方法来检索有向图的根的内容——我应该手动推断吗? :O 我尝试获取iter(myDiGraph),希望它会从根开始迭代,但顺序似乎是随机的......:\

我们将不胜感激,谢谢!

【问题讨论】:

在我不知情的情况下,图不一定有根,因此没有函数可以找到它。 【参考方案1】:

如果“一个根元素”是指您的有向图是rooted tree,那么根将是唯一一个度数为零的节点。

您可以通过以下方式在线性时间(节点数)内找到该节点:

In [1]: import networkx as nx

In [2]: G=nx.balanced_tree(2,3,create_using=nx.DiGraph()) # tree rooted at 0

In [3]: [n for n,d in G.in_degree() if d==0] 
Out[3]: [0]

或者您可以使用拓扑排序(根是第一项):

In [4]: nx.topological_sort(G)
Out[4]: [0, 1, 3, 8, 7, 4, 9, 10, 2, 5, 11, 12, 6, 13, 14]

或者,从给定(随机)节点开始并跟随前任节点直到找到没有前任节点的节点可能会更快。

【讨论】:

我尝试了拓扑排序并且成功了。速度不是这个操作的主要问题,所以我可能会坚持下去,但如果它确实成为一个问题,我会考虑你的第三个选项 我试过了,但得到了错误'DiGraph' object has no attribute 'in_degree'networkx 是否弃用或修改了 in_degree() ?您能否发布您使用的 networkx 版本? in_degree() 使用 DiGraph 为我工作。我正在使用networkx 版本2.2

以上是关于在networkx(Python)中获取有向图的根(头)的主要内容,如果未能解决你的问题,请参考以下文章

networkx有向图或二叉树的root根节点,Python

python 使用networkx绘制带权无向图和带权有向图,以及标注特定路径

networkx有向图或二叉树的节点高度,Python

networkx有向图或二叉树的节点高度,Python

Cytoscape结合Networkx生成有向图

Cytoscape结合Networkx生成有向图