2014-04-23 9 views
5

Ho lavorato con networkx già da un po 'di tempo e fino a poco tempo fa ho iniziato a svolgere bene i miei scopi con modifiche minime quando ho iniziato a esaminare il rilevamento della community. In confronto, il pacchetto igraph Python sembra avere implementazioni molto più ampie dei metodi di rilevamento della comunità (anche rispetto a networkx con il pacchetto della community di Thomas Aynaud aggiunto). Mi stavo chiedendo se c'è qualche API esistente, testata che consentirebbe una facile traduzione di un grafico di retex nella struttura igraph, quindi posso avvalermi dell'erogazione di potenza in quest'area?Interfaccia tra networkx e igraph

Le vostre risposte gentili sono molto apprezzate.

risposta

4

Networkx e python-igraph supportano entrambi una vasta gamma di algoritmi di lettura/scrittura (networkx, python-igraph).

Almeno due formati (GML e pajek) sembrano essere comuni tra i due, anche se non l'ho provato.

+0

Grazie Andrew per la tua rapida risposta. Si è scoperto che è piuttosto semplice ricostruire solo le strutture topologiche di un grafico NetwrokX in iGraph - il bit difficile è stato il nodo e gli attributi del bordo. Ma questo sarebbe sufficiente per i rilevamenti della comunità :) –

6

Ecco due modi per convertire un grafico NetworkX a un IGRAPH:

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() 

utilizzando l'elenco bordo era un po 'più veloce per il seguente grafico 2500 nodo sulla mia macchina:

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 

Utilizzando la la lista di bordo era anche un po 'più veloce per g = nx.complete_graph(2500).

+1

Questa risposta potrebbe essere aggiornata per Python 3. 'zip' non è più in grado di iscriversi. –

0

Come provo a memorizzare i nomi di nodi/bordi su entrambi igraph o nx, questa è la mia versione di un rivestimento che trasferisce anche nomi nodi durante il trasferimento dall'oggetto igraph, g, a 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()) 

e modo inverso se G, un oggetto nx, è dato ma è necessario un oggetto igraph:

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

Naturalmente questi non sono trasferimento completo come altri attributi del nodo e anche bordo attributo trasferimenti mancano ma spero sarebbe utile quando non li hai


versione più dettagliata di avere un maggiore controllo durante il trasferimento, da IGRAPH a 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()]) 

Da nx a IGRAPH:

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

(anche pubblicato here)