【问题标题】:Using Python Networkx and Numpy.Choice & Getting ValueError使用 Python Networkx 和 Numpy.Choice 并获取 ValueError
【发布时间】:2016-04-26 16:37:30
【问题描述】:

语言:Python 2.x 包:Networkx、Numpy

我的代码从我的图表中选择一个随机节点,然后执行以下操作:

1- 如果是隔离,则返回 while 循环的开头并选择另一个随机节点

2- 如果不是孤立的,则获取它的邻居

3 - 如果它只有 1 个邻居,那么您选择的随机邻居就是唯一的邻居

4-如果它有多个邻居,则从可用选项中随机选择一个邻居

5- 随机选择,检查 是否有邻居。就像上面一样.. 如果它有一个而不是将邻居的邻居设置为那个邻居

6-如果它有多个,则选择邻居的随机邻居

7-将我邻居的邻居连接到我(原来的随机节点)

这段代码一直有效,直到我在程序的另一部分中引入了一些小改动。我知道所有语法都有效,但我根本无法通过错误。下面是我的代码和错误。

while i <= self.iterations:
            node_list = nx.nodes(self.origin_network)


            random_node = numpy.random.choice(node_list)
            #print (" This random node has no neighbors:", self.origin_network.neighbors(random_node))
            if nx.is_isolate(self.origin_network, random_node) == True:
                i += 1
                print (" This random node has no neighbors:", self.origin_network.neighbors(random_node), "on turn", i)
                continue
            else:
                Neighbs = self.origin_network.neighbors(random_node)

                if len(Neighbs) == 1:
                    print ("The neighbor has no additional neighbors", "on turn", i)
                    random_neighb = Neighbs
                else:
                    random_neighb = numpy.random.choice(Neighbs) ***#This is line 108 which the error references***

                neighbs_of_neighb = self.origin_network.neighbors(random_neighb)
                if len(neighbs_of_neighb) == 1:
                    print ("This neighbor has only the original neighbor on turn", i)
                    random_NofN = neighbs_of_neighb
                    self.origin_network.add_edge(random_node, random_NofN)
                else:
                    random_NofN = numpy.random.choice(neighbs_of_neighb)
                    self.origin_network.add_edge(random_node, random_NofN)
                    print "success"
            i += 1

我收到的错误是:

self.triadic_method(self.origin_network , iteration, sim_number)

文件“D:\network.py”,第 108 行,在 triadic_method 中 random_neighb = numpy.random.choice(邻居) 文件“mtrand.pyx”,第 1121 行,在 mtrand.RandomState.choice (numpy\random\mtrand\mtrand.c:12473) 文件“mtrand.pyx”,第 945 行,在 mtrand.RandomState.randint (numpy\random\mtrand\mtrand.c:10732) 值错误:低 >= 高

错误引用的第 108 行是这一行:

random_neighb = numpy.random.choice(Neighbs) #这是错误引用的第 108 行

【问题讨论】:

  • 我对这条线感到困扰:random_neighb = Neighbs 因为我认为您希望random_neighb 成为一个节点,而Neighbs 是一个列表(此处包含一个节点)。不应该是random_neighb = Neighbs[0]吗?
  • 难道不是单个对象与单个项目相同吗?列出我的编码方式?
  • 我不这么认为。 a != [a].
  • hmm.. 好吧,它没有引发错误并且似乎正在工作,所以我认为另一个错误正在覆盖这个错误!显然,两个错误可以使一个正确..lol

标签: python python-2.7 numpy random networkx


【解决方案1】:

这可能是因为您使用的是定向网络。在有向网络中,非孤立节点可能没有邻居。例如,有 2 个节点 a、b 和一条从 a 到 b 的边。 a 和 b 都不是孤立的,a 有邻居 b,但 b 没有邻居。

NetworkX 将隔离定义为没有传入和传出边缘,但邻居不引用前辈。

如果您将 np.random.choice 应用于空列表,您将收到此处所述的错误。

【讨论】:

  • 就是这样!!!!谢谢你。不过,我不知道如何对其中的行为进行编码,所以我只是让我的网络无向并解决了它。当我这样做时,我会发布一个定向网络的解决方案。谢谢你。但是,由于某种原因,我仍然在这里和那里遇到一个异常,其中选择的随机节点不在图中..这没有意义!!
  • 您的程序没有很好地定义有向网络。如果您只想允许一个方向拾取,那么您可以使用 len(Neighbs) == 0 进行测试,但恐怕您正在尝试生成集群。虽然 NetworkX 有针对有向网络的前任()和后继者()函数,但最好只使用无向网络,因为有向网络中的三角形很棘手。
  • 是的,这就是我正在做的,但我将不得不重新编写我的代码.. 最终得到指导。我不知道有前任或后继功能 - 下次应该会有所帮助。
【解决方案2】:

您看到的 ValueError 来自 numpy.random.randint,当“低”和“高”输入未正确排序时,它会给出该错误。很难看出为什么会出现错误。大概choice 函数正在调用randint,其参数基于您的输入Neighbs 的特征。

我会在调用之前先打印 Neighbs 的值,然后看看你实际要求它做什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-17
    • 2015-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 2021-11-12
    相关资源
    最近更新 更多