2014-04-25 5 views
5

मुझे आसन्न मैट्रिक्स से, Python में ग्राफ़-टूल का उपयोग करके ग्राफ कैसे बनाना चाहिए? मान लें कि हमारे पास निकटता मैट्रिक्स के रूप में adj मैट्रिक्स है।ग्राफ़-टूल में एक आसन्न मैट्रिक्स से एक भारित ग्राफ बनाएं, पायथन इंटरफ़ेस

क्या अब मैं क्या इस तरह है:

 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] 

लेकिन यह सही नहीं लगता है, हम इस के लिए किसी भी बेहतर समाधान है?

(और मुझे लगता है कि इस के लिए एक उचित टैग graph-tool होगा, लेकिन मैं इसे नहीं जोड़ सकते हैं, पर्याप्त विशेषाधिकारों के साथ किसी तरह का व्यक्ति टैग बना सकता है?)

उत्तर

7

ग्राफ़-उपकरण अब ग्राफ को किनारों की एक सूची में जोड़ने के लिए एक समारोह भी शामिल है। अब आप उदाहरण के लिए, कर सकते हैं:

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

होना चाहिए और जो लोग आश्चर्य, के लिए 'स्थानांतरित()' 'numpy.transpose() है' – zm0

3

ग्रैप-उपकरण एक सीधा रास्ता प्रदान नहीं करता है एक आसन्न मैट्रिक्स से एक ग्राफ बनाने के लिए। AFAIK, यह बूस्ट ग्राफ लाइब्रेरी से आसन्नता सूची ग्राफ प्रतिनिधित्व का उपयोग करता है, जो इसके लिए एक कारण हो सकता है (हालांकि शायद लेखक भविष्य में इसके लिए कार्यान्वयन प्रदान कर सकता है)।

मुझे ग्राफ-टूल के साथ एक आसन्न मैट्रिक्स से ग्राफ़ बनाने के साथ काम करना पड़ा, और मेरा कोड आपके जैसा ही दिखता था - और खराब महसूस नहीं हुआ। अगर आसन्नता मैट्रिक्स कुछ पिछली गणनाओं का परिणाम है, तो मुझे नहीं लगता कि आप एक और सौंदर्य समाधान का काम कर सकते हैं। हालांकि, अगर इसे किसी फ़ाइल से पढ़ा जाता है, तो आप ग्राफ़ को पढ़ने के लिए उस कोड का उपयोग करने पर विचार कर सकते हैं और इसे ग्राफ़-टूल स्वीकार करने वाले कुछ प्रारूप में सहेज सकते हैं (save(), load() और load_graph()graph_tool documentation और the Graph I/O section of the quickstart में देखें)।

बीटीडब्ल्यू, सलाह का एक अनिश्चित टुकड़ा। आपके कोड में, यह देखते हुए कि आप एक अप्रत्यक्ष ग्राफ बना रहे हैं, आप j की श्रेणियों को बदलकर मैट्रिक्स के आधे से गुजरने से बच सकते हैं। यह मानते हुए कि adj एक वर्ग मैट्रिक्स है, तो आप इस प्रकार कर सकते हैं (जो होना चाहिए, है ना?):

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

यह Tiago's answer के लिए एक टिप्पणी होना चाहिए, लेकिन मुझे लगता है कि के लिए पर्याप्त प्रतिष्ठा नहीं है।

graph_tool के नवीनतम संस्करण (2.26) के लिए मेरा मानना ​​है कि वहां एक लापता संक्रमण है। निकटता मैट्रिक्स के i,j प्रविष्टि किनारे शिखर j से जा रहा i शीर्ष के के वजन को दर्शाता है, तो यह

g.add_edge_list(transpose(transpose(adj).nonzero())) 
संबंधित मुद्दे