6

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 にノードトラバーサルにエッジが存在する場合、どう対処すれば無限ループが発生しますか?

ありがとう。

4

1 に答える 1

9

グラフの構築:

>>> 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 には、これに対して堅牢なトラバーサル アルゴリズムがあります。

于 2012-08-20T17:39:04.227 に答える