2014-11-01 61 views
0

我在嘗試在NetworkX中創建反轉有向圖的深層副本並檢查該副本的PageRank時遇到了問題。這個問題似乎並沒有出現在PageRank中,它只是在計算斷開的逆向有向圖的PageRank時拋出異常。NetworkX - 創建反轉圖的深層副本

首先,我使用這個代碼生成一個圖,它基本上只創建一堆節點,隨機選取其中的一些,然後從該節點向另外50個隨機選擇的節點繪製有向邊。然後,它以0

def global_classroom(nodes): 
    network = nx.DiGraph() 
    network.add_nodes_from([User(i, "0.0.1") for i in range(nodes)]) 
    network_nodes = network.nodes() 
    teachers = random.sample(network_nodes, nodes/100) 
    for teacher in teachers: 
     for i in range(nodes/20): 
      student = network_nodes[random.randrange(nodes)] 
      if teacher != student: 
      network.add_edge(teacher, student) 
    for node in network_nodes: 
     if network.degree(node) == 0: 
      network.remove_node(node) 
    return network 

度修剪所有節點現在,如果我把這:

G = global_classroom(1000) 
G.reverse(False) 
print nx.pagerank(G) 

一切工作完全正常。 NetworkX能夠計算PageRank沒有問題。

但是,如果我把這稱爲:

G = global_classroom(1000) 
G_page_rank = G.reverse() 
nx.pagerank(G_page_rank) 

有拋出

Traceback (most recent call last): 
    File "a.py", line 62, in <module> 
    rank = nx.pagerank(L_page_rank) 
    File "<string>", line 2, in pagerank 
    File "/Users/PSnyder/Documents/Git/infection/networkx/utils/decorators.py", line 68, in _not_implemented_for 
    return f(*args,**kwargs) 
    File "/Users/PSnyder/Documents/Git/infection/networkx/algorithms/link_analysis/pagerank_alg.py", line 140, in pagerank 
    dangling_nodes = [n for n in W if W.out_degree(n, weight=weight) == 0.0] 
    File "/Users/PSnyder/Documents/Git/infection/networkx/classes/digraph.py", line 1023, in out_degree 
    return next(self.out_degree_iter(nbunch,weight))[1] 
    File "/Users/PSnyder/Documents/Git/infection/networkx/classes/digraph.py", line 941, in out_degree_iter 
    for n,nbrs in nodes_nbrs: 
    File "/Users/PSnyder/Documents/Git/infection/networkx/classes/digraph.py", line 934, in <genexpr> 
    nodes_nbrs=((n,self.succ[n]) for n in self.nbunch_iter(nbunch)) 
    KeyError: <__main__.User object at 0x104618050> 

哪裏<__main__.User object at 0x104618050>是許多對象組成節點,我有向圖中的一個例外。

我希望能夠簡單地製作一個深層副本,而不需要再次反轉我的圖形以將其恢復爲其原始形式。

下面是用戶級的,這使得我的節點的全部:

class User(object): 
    def __init__(self, name, version, teachers = [], students = []): 
     self.name = name 
     self.version = version 
     G.add_node(self) 
     self.add_teachers(teachers) 
     self.add_students(students) 

    def add_students(self, students): 
     for student in students: 
      G.add_edge(self, student) 

    def add_teachers(self, teachers): 
     for teacher in teachers: 
      G.add_edge(teacher, self) 
+1

你就不能進行圖形的深層副本分開(用'copy.deepcopy(G)'),然後反向複製? – BrenBarn 2014-11-01 22:00:58

+0

爲什麼,是的,我可以!奇怪的是,這有效,但nx.reverse(G)沒有。 – 2014-11-01 22:23:34

回答

1

也許你的用戶對象引起的問題嗎?你沒有包含這個,所以我不能看到這是否是一個networkx錯誤。

這工作(使用整數,而不是用戶())

import networkx as nx 
import random 

def global_classroom(nodes): 
    network = nx.DiGraph() 
    network.add_nodes_from([i for i in range(nodes)]) 
    network_nodes = network.nodes() 
    teachers = random.sample(network_nodes, nodes/100) 
    for teacher in teachers: 
     for i in range(nodes/20): 
      student = network_nodes[random.randrange(nodes)] 
      if teacher != student: 
       network.add_edge(teacher, student) 
    for node in network_nodes: 
     if network.degree(node) == 0: 
      network.remove_node(node) 
    return network 


if __name__=='__main__': 
    G = global_classroom(1000) 
    G.reverse(False) 
    print nx.pagerank(G).items()[0:5] # first 5 
+0

在上面添加了用戶類代碼。這可能是因爲我的'add_students'和'add_teachers'方法在做一些有趣的事情。 (再次,可能不會,因爲我生成我的圖時從來沒有打電話給他們)。 – 2014-11-02 01:43:07