2014-04-23 22 views
5

Ich habe jetzt mit NetworkX seit geraumer Zeit arbeiten und es ist meine Zwecke recht gut mit minimalen Verbesserungen bis vor kurzem dient, wenn ich auf der Suche in Gemeinschaft Erkennung gestartet. Im Vergleich dazu scheint das Python-Paket von igraph eine viel breitere Implementierung von Community-Erkennungsmethoden zu haben (sogar im Vergleich zu networkx mit dem Community-Paket von Thomas Aynaud). Ich frage mich nur, ob es eine existierende, getestete API gibt, die eine einfache Übersetzung eines Netzwerk-x-Graphen in die igra-Struktur erlaubt, damit ich die Macht nutzen kann, die igraph in diesem Bereich bietet?Schnittstelle zwischen NetworkX und IGRAPH

Ihre Art Antworten sind sehr willkommen.

Antwort

4

Networkx und Python-iigraph unterstützen beide eine Vielzahl von Lese-/Schreibalgorithmen (networkx, python-igraph).

Mindestens zwei Formate (GML und Pajek) erscheinen zwischen den beiden gemeinsam zu sein, obwohl ich nicht versucht haben.

+0

Danke Andrew für deine schnelle Antwort. Es stellte sich heraus, dass es nur trivial ist, nur die topologischen Strukturen eines NetwrokX-Graphen in iGraph zu rekonstruieren - das knifflige Bit waren die Knoten- und Kantenattribute. Aber das würde für Community-Erkennungen ausreichen :) –

6

Hier zwei Möglichkeiten, eine NetworkX Graph zu einer IGRAPH zu konvertieren:

import networkx as nx, igraph as ig 

# create sample NetworkX graph 
g = nx.planted_partition_graph(5, 5, 0.9, 0.1, seed=3) 

# convert via edge list 
g1 = ig.Graph(len(g), zip(*zip(*nx.to_edgelist(g))[:2])) 
    # nx.to_edgelist(g) returns [(0, 1, {}), (0, 2, {}), ...], which is turned 
    # into [(0, 1), (0, 2), ...] for igraph 

# convert via adjacency matrix 
g2 = ig.Graph.Adjacency((nx.to_numpy_matrix(g) > 0).tolist()) 

assert g1.get_adjacency() == g2.get_adjacency() 

die Kantenliste verwenden war etwas schneller für den folgenden 2500-Knoten Graph auf meinem Rechner:

In [5]: g = nx.planted_partition_graph(50, 50, 0.9, 0.1, seed=3) 

In [6]: %timeit ig.Graph(len(g), zip(*zip(*nx.to_edgelist(g))[:2])) 
1 loops, best of 3: 264 ms per loop 

In [7]: %timeit ig.Graph.Adjacency((nx.to_numpy_matrix(g) > 0).tolist()) 
1 loops, best of 3: 496 ms per loop 

die Verwendung von Kantenliste war auch etwas schneller für g = nx.complete_graph(2500).

+1

Diese Antwort könnte für Python 3 aktualisiert werden. 'Zip' ist nicht mehr subskriptfähig. –

0

Als ich versuche, Namen von Knoten zu speichern/Kanten auf beiden IGRAPH oder nx, das ist meine Einzeiler-Version, die auch Knoten Namen überträgt, während sie von IGRAPH Objekt übertragen, g, zu nx:

G = nx.from_edgelist([(names[x[0]], names[x[1]]) 
         for names in [g.vs['name']] # simply a let 
         for x in g.get_edgelist()], nx.DiGraph()) 

und der umgekehrte Weg, wenn G ein nx Objekt gegeben ist, sondern ein IGRAPH Objekt benötigt:

g = igraph.Graph.TupleList(G.edges(), directed=True) 

natürlich sind dies nicht die vollständige Übertragung als andere Knotenattribute und Kanten auch Transfers Attribut fehlt, aber ich hoffe, wäre nützlich, wenn Sie sie nicht haben.


ausführlichere Version, die Sie haben mehr Kontrolle während der Übertragung, von IGRAPH zu nx:

G = nx.DiGraph() 
names = g.vs['name'] 
G.add_nodes_from(names) 
G.add_edges_from([(names[x[0]], (names[x[1]])) for x in g.get_edgelist()]) 

Von nx IGRAPH:

g = igraph.Graph(directed=True) 
g.add_vertices(G.nodes()) 
g.add_edges(G.edges()) 

(auch here veröffentlicht)

Verwandte Themen