2017-10-18 81 views
0

我创建了一个图,我想验证所有的子树(目的是可视化层次结构),但是有一个错误,并且每个节点的结果都是相同的,而我知道例如node1有一个子树和节点10没有一个子树:无法理解networkx中dfs_tree的结果?

>  G = nx.from_pandas_dataframe(db, 'name1','name2','weight',nx.Graph()) 
`enter code here`nodes  = G.nodes() edges= G.edges() 
> node_and_degree=G.degree() 
> 
> d=dict(zip(G.nodes(),G.edges())) 
> 
> degree=list(zip(G.nodes(),G.degree().values())) degree_sort= 
> sorted(degree,key=itemgetter(1), reverse=True) 


inner_nodes1 = [ n for n in nodes if G.degree(n) >=200 ] 
inner_nodes2 = [ n for n in nodes if (100<= G.degree(n) <200) ] 
inner_nodes3 = [ n for n in nodes if (50<= G.degree(n) <100) ] 
inner_nodes4 = [ n for n in nodes if (20<= G.degree(n) <50) ] 
inner_nodes5 = [ n for n in nodes if (10<= G.degree(n) <20) ] 
inner_nodes6= [ n for n in nodes if (2<= G.degree(n) <10) ] 
leaves  = set(n for n in nodes if G.degree(n) == 1) 
inner_nodes = [ n for n in nodes if G.degree(n) >1 ] 

> from collections import defaultdict from 
> networkx.algorithms.traversal.depth_first_search import dfs_tree 
> 
> for i in range(len(inner_nodes)): 
> 
>  print(dfs_tree(G,i)) 
> 
> --------------------------------------------------------------------------- KeyError         Traceback (most recent call 
> last) <ipython-input-25-4494433c2afc> in <module>() 
>  4 for i in range(len(inner_nodes)): 
>  5 
> ----> 6  print(dfs_tree(G,i)) 
>  7 
> 
> C:\ProgramData\Anaconda3\lib\site-packages\networkx\algorithms\traversal\depth_first_search.py 
> in dfs_tree(G, source) 
>  99  else: 
>  100   T.add_node(source) 
> --> 101  T.add_edges_from(dfs_edges(G,source)) 
>  102  return T 
>  103 
> 
> C:\ProgramData\Anaconda3\lib\site-packages\networkx\classes\digraph.py 
> in add_edges_from(self, ebunch, attr_dict, **attr) 
>  633      "The attr_dict argument must be a dict.") 
>  634   # process ebunch 
> --> 635   for e in ebunch: 
>  636    ne = len(e) 
>  637    if ne==3: 
> 
> C:\ProgramData\Anaconda3\lib\site-packages\networkx\algorithms\traversal\depth_first_search.py 
> in dfs_edges(G, source) 
>  59    continue 
>  60   visited.add(start) 
> ---> 61   stack = [(start,iter(G[start]))] 
>  62   while stack: 
>  63    parent,children = stack[-1] 
> 
> C:\ProgramData\Anaconda3\lib\site-packages\networkx\classes\graph.py 
> in __getitem__(self, n) 
>  405   {1: {}} 
>  406   """ 
> --> 407   return self.adj[n] 
>  408 
>  409  def add_node(self, n, attr_dict=None, **attr): 
> 
> KeyError: 0 
> 
> len(list(dfs_tree(G,'1'))) 
1000 

len(list(dfs_tree(G,'10'))) 

1000 

我无法理解结果,可能是我在错误的路径,任何帮助或评论赞赏!

回答

1

for i in range(len(inner_nodes))导致第一个i0。错误消息说G没有节点0

至于10和1具有相同尺寸的树木:

如果您的图形是一个无向图,则深度优先搜索会发现包含节点的整个组件。它不知道你希望它找到一个子树,因为这个概念不存在于一个无向图中。所以如果1和10在同一棵树中,它会给出相同的一组节点(但具有不同的顺序)。

+0

如何打印关于每个节点索引的子树? 'dfs_tree(G,节点索引)',因为我有1000个节点。我想为每个节点或在图中更重要的节点打印所有子树。 – sunny

+0

我创建了一个有向图,现在我有了Inner_nodes 10子树,有趣的是,对于树叶我有11个子树,我预计有0棵子树! – sunny