【问题标题】:NetworkX - creating a deep copy of reversed graphNetworkX - 创建反向图的深层副本
【发布时间】:2014-11-01 21:50:23
【问题描述】:

我在尝试在 NetworkX 中创建反向有向图的深层副本并检查该副本的 PageRank 时遇到问题。问题似乎与 PageRank 无关,它只是在尝试计算损坏的反向有向图的 PageRank 时抛出异常。

首先,我使用此代码生成一个有向图,它基本上只是创建一堆节点,随机选择其中一些,然后从该节点绘制有向边到另外 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>

&lt;__main__.User object at 0x104618050&gt; 是构成我的有向图中节点的众多对象之一。

我希望能够简单地进行深层复制,而不是需要再次反转我的图表以将其恢复为原始形式。

这是构成我的节点的整个 User 类:

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))然后反转副本吗?
  • 为什么,是的,我可以!奇怪的是,这行得通,但 nx.reverse(G) 不行。

标签: python graph networkx


【解决方案1】:

也许您的用户对象引起了问题?您没有包含它,所以我看不出这是否是 networkx 错误。

这可行(使用整数而不是 User())

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

【讨论】:

  • 添加了上面的 User 类代码。可能是我的add_studentsadd_teachers 方法正在做一些有趣的事情。 (再说一次,可能不会,因为我在生成图表时从不调用它们)。
猜你喜欢
  • 2023-03-05
  • 1970-01-01
  • 2011-07-03
  • 2012-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-21
相关资源
最近更新 更多