【问题标题】:How to list specific node/edge in networkx?如何列出networkx中的特定节点/边缘?
【发布时间】:2012-08-21 12:11:40
【问题描述】:

假设networkx图中有一个如下树状结构:

n-----n1----n11
 |     |----n12
 |     |----n13
 |           |----n131 
 |----n2             | 
 |     |-----n21     X
 |     |-----n22     |
 |            |----n221 
 |----n3


      n4------n41
      n5
  1. 如何列出所有带有“子节点”的节点及其深度,这里:n,n1,n13,n2,n22,n4
  2. 如何列出所有没有“子节点”的节点,这里:n11,n12,n21,n41,n5
  3. 如何列出孤立节点,此处:n5 以及如何列出“孤立”边,不属于根 n 边,此处为 n4-n41,
  4. 如何列出具有超过 2 个“子节点”的节点,此处为 n,n1
  5. 如果n131,n221在节点遍历中存在边,会出现无限循环怎么办?

谢谢。

【问题讨论】:

  • 你应该看看 Graphs 的 networkX 文档:networkx.lanl.gov/reference/classes.graph.html#networkx.Graph 你的大部分任务都可以通过那里的功能和一些迭代来解决。
  • @Michael Mauderer,对于没有属性的节点这么简单吗?
  • 属性不应该对你正在做的事情产生任何影响。
  • 您应该给出一个图表的示例构造,以便我们可以帮助解决这些问题

标签: python graph traversal networkx


【解决方案1】:

图形构建:

>>> import networkx as nx
>>> G = nx.DiGraph()
>>> G.add_edges_from([('n', 'n1'), ('n', 'n2'), ('n', 'n3')])
>>> G.add_edges_from([('n4', 'n41'), ('n1', 'n11'), ('n1', 'n12'), ('n1', 'n13')])
>>> G.add_edges_from([('n2', 'n21'), ('n2', 'n22')])
>>> G.add_edges_from([('n13', 'n131'), ('n22', 'n221')])
>>> G.add_edges_from([('n131', 'n221'), ('n221', 'n131')]
>>> G.add_node('n5')
  1. 使用out_degree 函数查找所有具有子节点的节点:

    >>> [k for k,v in G.out_degree().iteritems() if v > 0]
    ['n13', 'n', 'n131', 'n1', 'n22', 'n2', 'n221', 'n4']
    

    请注意,n131 和 n221 也会出现在此处,因为它们彼此都有优势。如果你愿意,你可以过滤掉这些。

  2. 所有没有子节点的节点:

    >>> [k for k,v in G.out_degree().iteritems() if v == 0]
    ['n12', 'n11', 'n3', 'n41', 'n21', 'n5']
    
  3. 所有孤立节点,即度数为0的节点:

    >>> [k for k,v in G.degree().iteritems() if v == 0]
    ['n5']
    

    要获取所有孤立的“边”,您可以获取图形的组件列表,过滤掉不包含n 的组件,然后只保留有边的组件:

    >>> [G.edges(component) for component in nx.connected_components(G.to_undirected()) if len(G.edges(component)) > 0 and 'n' not in component]
    [[('n4', 'n41')]]
    
  4. 具有 2 个以上子节点的节点:

    >>> [k for k,v in G.out_degree().iteritems() if v > 2]
    ['n', 'n1']
    
  5. 如果你遍历树,你不会得到一个无限循环。 NetworkX 具有强大的遍历算法。

【讨论】:

  • 感谢这个清晰的演示,但是对于 1,如果我们将“n”作为根,您能否展示更多信息以发现 n131 和 n221 是它们自己通往 n 的路径上最深的节点?我无法弄清楚shortest_path(n, X) 在这种情况下可能会起作用的方式,neighbor() 是否也应该参与?
  • 对不起,我不明白你在问什么。
  • n221 不应该是 n131 的子节点,如果 n 是 root,visise visa。那么如何检测这种节点并将它们定义为“无子节点”呢?
  • 如果兄弟之间有边,那它就不是一棵树。
  • 是的,从技术上讲,它不再是一棵“树”了,我不知道如何命名它,但是这个边缘确实存在,问题是如何在这棵“树”中检测它们-像“结构?
猜你喜欢
  • 1970-01-01
  • 2021-01-02
  • 2021-09-27
  • 2023-04-05
  • 1970-01-01
  • 2016-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多