2014-04-25 7 views
5

Wie soll ich ein Diagramm erstellen mit Graph-Tool in Python, aus einer Adjazenz-Matrix? Angenommen, wir haben adj Matrix als Adjazenzmatrix.Erstellen Sie ein gewichtetes Diagramm aus einer Adjazenzmatrix in Graph-Tool, Python-Schnittstelle

Was ich jetzt tun, ist wie folgt:

 g = graph_tool.Graph(directed = False) 
     g.add_vertex(len(adj)) 
     edge_weights = g.new_edge_property('double') 
     for i in range(adj.shape[0]): 
      for j in range(adj.shape[1]): 
       if i > j and adj[i,j] != 0: 
        e = g.add_edge(i, j) 
        edge_weights[e] = adj[i,j] 

Aber es fühlt sich nicht richtig, tun wir eine bessere Lösung für dieses?

(und ich denke, ein richtiger Tag für diesen graph-tool sein würde, aber ich kann es nicht hinzufügen, eine Art Person mit genügend Privilegien könnte den Tag machen?)

Antwort

7

Graph-Tool enthält nun eine Funktion, um eine Liste von Kanten in die Grafik hinzuzufügen. Sie können jetzt zum Beispiel:

adj = numpy.random.randint(0, 2, (100, 100)) # a random directed graph 
g = Graph() 
g.add_edge_list(transpose(adj.nonzero())) 
+0

Und für diejenigen, die sich fragen, sein 'transponieren()' ist 'numpy.transpose()' – zm0

3

grap-Tool bietet keinen direkten Weg um einen Graphen aus einer Adjazenzmatrix zu erstellen. AFAIK verwendet es die Adjazenzlisten-Graphendarstellung aus der Boost-Graph-Bibliothek, was ein Grund dafür sein könnte (obwohl der Autor vielleicht eine Implementierung dafür in der Zukunft bereitstellen wird).

Ich musste mit Graph-Tool arbeiten ein Diagramm aus einer Adjazenz-Matrix erstellen, und mein Code sah sehr ähnlich zu Ihnen - und es fühlte sich nicht , dass schlecht. Wenn die Adjazenzmatrix das Ergebnis früherer Berechnungen ist, glaube ich nicht, dass Sie eine Schönheitslösung erarbeiten können. Wenn es jedoch aus einer Datei gelesen wird, können Sie diesen Code einmal verwenden, um das Diagramm zu lesen und in einem Format zu speichern, das das Diagrammwerkzeug akzeptiert (siehe save(), load() und load_graph() in graph_tool documentation und the Graph I/O section of the quickstart).

BTW, ein unaufgefordert Ratschlag. Da Sie in Ihrem Code einen ungerichteten Graphen erstellen, können Sie die Hälfte der Matrix vermeiden, indem Sie die Bereiche j variieren. Unter der Annahme, dass adj ist eine quadratische Matrix, können Sie wie folgt (was sein soll, nicht wahr?):

g = graph_tool.Graph(directed = False) 
g.add_vertex(len(adj)) 
edge_weights = g.new_edge_property('double') 
num_vertices = adj.shape[0] 
for i in range(num_vertices - 1): 
    for j in range(i + 1, num_vertices): 
     if adj[i,j] != 0: 
      e = g.add_edge(i, j) 
      edge_weights[e] = adj[i,j] 
1

Dies sollte ein Kommentar zu Tiago's answer sein, aber ich habe nicht genug Ruf dafür.

Für die neueste Version (2.26) von graph_tool glaube ich, dass dort eine fehlende Transponierung ist. Der i,j Eintritt der Adjazenzmatrix bezeichnet das Gewicht der Kante von Knoten gehen ji nach Knoten, so sollte es

g.add_edge_list(transpose(transpose(adj).nonzero())) 
Verwandte Themen