2014-04-23 6 views
5

के बीच इंटरफ़ेस मैं नेटवर्कक्स के साथ कुछ समय से काम कर रहा हूं और हाल ही में जब तक मैंने सामुदायिक पहचान की तलाश शुरू की है, तब तक यह न्यूनतम उद्देश्यों के साथ मेरे उद्देश्यों की पूर्ति कर रहा है। तुलनात्मक रूप से, आइग्राफ पायथन पैकेज में सामुदायिक पहचान विधियों का व्यापक कार्यान्वयन होता है (यहां तक ​​कि थॉमस अयनाद के सामुदायिक पैकेज के साथ नेटवर्कक्स की तुलना में)। मैं बस सोच रहा हूं कि कोई मौजूदा, परीक्षण किया गया एपीआई है जो नेटवर्क संरचना के आसान अनुवाद को igraph संरचना में अनुमति देगा, इसलिए मैं इस क्षेत्र में पावर इग्राफ का लाभ उठा सकता हूं?नेटवर्कक्स और igraph

आपके तरह के उत्तरों की अत्यधिक सराहना की जाती है।

उत्तर

4

नेटवर्कक्स और पायथन-इग्राफ दोनों पढ़ने/लिखने वाले एल्गोरिदम (networkx, python-igraph) की एक विस्तृत श्रृंखला का समर्थन करते हैं।

कम से कम दो प्रारूप (GML और पायजेक) दोनों के बीच आम हैं, हालांकि मैंने यह कोशिश नहीं की है।

+0

आपके त्वरित उत्तर के लिए एंड्रयू धन्यवाद। यह पता चला कि आईग्राफ में नेटरोकॉक्स ग्राफ के केवल स्थलीय संरचनाओं का पुनर्निर्माण करना काफी मुश्किल है - मुश्किल बिट नोड और किनारे के गुण हैं। लेकिन यह सामुदायिक detections के लिए पर्याप्त होगा :) –

6
यहाँ

दो तरीके एक igraph करने के लिए एक NetworkX ग्राफ कन्वर्ट करने के लिए:

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

का उपयोग करते हुए बढ़त सूची को कुछ हद तक था मेरी मशीन पर तेजी से निम्नलिखित 2500 नोड ग्राफ के लिए:

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 

का उपयोग करना एज सूची g = nx.complete_graph(2500) के लिए कुछ हद तक तेज थी।

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

:

+1

यह प्रतिक्रिया पायथन 3 के लिए अद्यतन किया जा सकता है। 'ज़िप' अब सबस्क्रिप्ट-सक्षम नहीं है। –

0

मैं नोड्स के नाम को स्टोर करने की कोशिश के रूप में/दोनों igraph या NX पर किनारों, यह मेरा एक लाइनर संस्करण जो भी नोड्स के नाम हस्तांतरित कर देता है, जबकि igraph वस्तु, g से स्थानांतरित करने, NX है अन्य नोड विशेषताओं के रूप में नहीं पूरा हस्तांतरण

g = igraph.Graph.TupleList(G.edges(), directed=True) 
बेशक

इन कर रहे हैं और यह भी विशेषता स्थानान्तरण याद कर रहे हैं किनारे लेकिन मुझे आशा है कि हो सकता है: और जी, एक NX वस्तु अगर रिवर्स रास्ता दिया जाता है, लेकिन एक igraph वस्तु की जरूरत है उपयोगी जब आपके पास नहीं है। आप अधिक नियंत्रण है कि जब तक स्थानांतरित igraph से 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()]) 

NX से igraph रहे हैं:

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

(भी here पोस्ट)

संबंधित मुद्दे