2016-04-26 12 views
0

Sprache: Python 2.x Pakete: NetworkX, NumpyMit Python NetworkX und Numpy.Choice & Anfahrt Valueerror

nimmt Mein Code einen zufälligen Knoten aus meinem Graph dann macht folgendes:

1- wenn es ist ein Isolat, zu Beginn der while-Schleife zurückgehen und eine anderen Zufallsknoten wählt

2-, wenn es nicht ein Isolat ist, es Nachbarn

3 erhalten - wenn es nur ein Nachbarn hat dann den zufälligen Nachbarn Sie wählen, ist das nur n eighbor

4-wenn es mehr als ein Nachbarn hat, dann wählen Sie einen zufälligen Nachbarn aus den Möglichkeiten zur Verfügung

5-, dass zufällige Wahl, um zu sehen, ob es Nachbarn hat. Nur oben wie .. wenn es eine als gesetzt den Nachbarn Nachbarn muss sein, dass ein Nachbar

6-wenn es mehr als man dann einen zufälligen Nachbarn von Nachbarn holen hat

7- den Nachbarn meines verbinden Nachbar zu mir (der ursprüngliche Zufallsknoten)

Dieser Code HABE gearbeitet, bis ich einige kleinere Änderungen in einem anderen Teil meines Programms eingeführt habe. Ich weiß, dass die ganze Syntax funktioniert, aber ich kann einfach den Fehler nicht bestehen. Unten ist mein Code und der Fehler.

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 

Der Fehler I erhalten ist:

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

File "D:\network.py", line 108, in triadic_method random_neighb = numpy.random.choice(Neighbs) File "mtrand.pyx", line 1121, in mtrand.RandomState.choice (numpy\random\mtrand\mtrand.c:12473) File "mtrand.pyx", line 945, in mtrand.RandomState.randint (numpy\random\mtrand\mtrand.c:10732) ValueError: low >= high

Leitung 108, die den Fehler Referenzen ist dieses:

random_neighb = numpy.random.choice (Neighbs) #Dies Linie 108 der Fehler verweist auf

+0

Mich stört diese Zeile: 'random_neighb = Neighbors', weil ich glaube, dass' random_neighb' ein Knoten sein soll, während 'Neighbors' eine Liste ist (hier mit einem einzelnen Knoten).Sollte es nicht 'random_neighb = Neighbours [0]' sein? – Joel

+0

Wäre nicht ein einzelnes Objekt das gleiche wie ein einzelnes Objekt, listet es auf, wie ich es codiert habe? – Joseph

+0

Ich glaube nicht. 'a! = [a]'. – Joel

Antwort

1

Dies könnte aufgrund Ihrer Arbeit an einem gerichteten Netzwerk sein. In gerichteten Netzwerken ist es möglich, keine Nachbarn für nicht isolierte Knoten zu haben. Zum Beispiel mit 2 Knoten a, b und einer Kante von a nach b. Weder a noch b ist isoliert, ein Wille hat Nachbar b, aber b hat keinen Nachbarn.

NetworkX definiert isoliert als keine eingehenden und keine ausgehenden Kanten, aber Nachbarn beziehen sich nicht auf die Vorgänger.

Wenn Sie np.random.choice auf eine leere Liste anwenden, erhalten Sie den hier angegebenen Fehler.

+0

Das war genau das !!!! Vielen Dank. Ich konnte jedoch nicht herausfinden, wie ich das Verhalten dort programmieren sollte, also machte ich einfach mein Netzwerk ungerichtet und es löste es. Ich poste eine Lösung für ein gerichtetes Netzwerk, wenn ich es mache. Vielen Dank. Aus irgendeinem Grund bekomme ich hier und da aber immer noch eine Ausnahme, wo der ausgewählte Zufallsknoten nicht in der Grafik ist ... was nicht sinnvoll ist !! – Joseph

+0

Ihr Verfahren ist mit gerichtetem Netzwerk nicht sehr gut definiert. Wenn Sie nur eine gerichtete Auswahl zulassen möchten, können Sie len (Neighbors) == 0 zum Testen verwenden, aber ich befürchte, dass Sie versuchen, Cluster zu generieren. Obwohl NetworkX die Vorgänger() und Nachfolger() für gerichtete Netzwerke verwendet, ist es möglicherweise besser, nur das ungerichtete Netzwerk zu verwenden, da Dreiecke im gerichteten Netzwerk schwierig sind. –

+0

Ja, das mache ich, aber ich werde meinen Code neu schreiben müssen. Ich wusste nicht, dass es eine Vorgänger- oder Nachfolgerfunktion gab - das sollte beim nächsten Mal helfen. – Joseph

0

Der ValueError, den Sie sehen, stammt aus numpy.random.randint, die diesen Fehler gibt, wenn die "Low" - und "High" -Eingänge nicht korrekt geordnet sind. Es ist schwer zu verstehen, warum Sie den Fehler erhalten. Vermutlich ruft die choice Funktion randint mit Argumenten auf, die auf Eigenschaften Ihrer Eingabe basieren Neighbs.

Ich würde beginnen, indem ich die Werte von Neighbits direkt vor diesem Aufruf drucke und sehe, was Sie eigentlich verlangen.

+0

Yep. Vielen Dank. – Joseph

Verwandte Themen