我在嘗試在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)
你就不能進行圖形的深層副本分開(用'copy.deepcopy(G)'),然後反向複製? – BrenBarn 2014-11-01 22:00:58
爲什麼,是的,我可以!奇怪的是,這有效,但nx.reverse(G)沒有。 – 2014-11-01 22:23:34