[Python] networkx入門 轉


networkx是python的一個第三方包,可以方便地調用各種圖算法的計算。
通過調用python畫圖包matplotlib能實現圖的可視化。

1.安裝


正好整理一下python第三方包的安裝方法。

setuptools

使用setuptools包,我們能夠手動下載,安裝第三方包。
使用方式:
下載第三方包源文件,在setup.py目錄下執行
``` python XX install ```

easy_install

easy_install工具,自動化地根據第三方包的名稱,一鍵聯網搜索,下載並且調用setuptools安裝。
使用方式:
上網下載ez_setup.py文件,執行
python ez_setup.py安裝setuptools工具。
執行
``` easy_install SQLObject ```
安裝第三方包

pip

與easy_install類似,根據名稱一鍵下載,調用setuptools安裝。pip是可以看作是easy_install的升級版。
使用方式:
先下載get-pip.py文件
運行python get-pip.py,自動安裝,包括setuptools在內的包
使用:
``` pip install simplejson --安裝包 pip install --upgrade simplejson --升級包 pip uninstall simplejson --卸載包 ```

使用setuptools自助下載安裝,經常會遇到包確實,沒有制定編譯器等等各種問題而導致安裝失敗。所以使用easy_install或者pip是比較方便的選擇。

安裝networkx

安裝networkx之前要安裝畫圖工具matplotlib,以及矩陣運算工具numpy,於是我們執行:
pip install numpy
pip install matplotlib
pip install networkx
安裝完成。

2.使用

networkx的英文版說明可以在其官方網站上下載得到,寫的簡單易懂。

這里記錄下一些簡單的建圖方法。
在networkx中,圖以對象的形式提供接口。
在圖對象中,還有點,邊等也是以對象形式提供,畫圖則調用matplotlib的函數完成。

**建圖 **

networkx可以建立簡單無向圖graph,有向圖digraph,可重復邊的multi-graph。
import networkx as nx
G=nx.Graph()
D=nx.DiGraph()
M=nx.MultiGraph()

這里的點可以是任意可區分的對象(hashable),比如數字,字符串,對象等。
G.add_node(1)
G.add_node('first_node')
#這里用一個對象多為key來唯一區別一個點
#我們還能夠用一個列表來批量加入點
G.add_nodes_from([1,2,3])
#還可以用一個圖對象作為點,嵌入到其他圖中
G.add_node(D) #這里D作為一個點的key
#或者把一個圖的所有點賦予另一個圖
G.add_nodes_from(D) #這里返回D的所有點,賦予G
#與加入相同的傳遞方法,我們也可以刪除點
G.remove_node(1)
G.remove_nodes_from([1,2,3])

這里的邊可以使用兩個單獨的對象作為輸入
G.add_edge(1,2) #表示1,2之間有一條邊。
#如果不存在點1,2,則會自動加入點集合。
#或者以元組的形式作為輸入
e=(1,2)
G.add_edge(*e)
#這里的*代表吧元組解包(unpack),當作一個個的值扔到函數中去。
#如果不解包,等價於
#G.add_edge(e)=G.add_edge((1,2))與參數傳遞的方式不符。
#類似的,我們還可以使用包含元組的列表來傳遞參數
G.add_edges_from([(1,2),(2,3)])
#我們還可以報一個圖的邊賦予另一個圖
G.add_edges_from(H)
#刪除
G.remove_edge(1,2)
G.remove_edges_from([(1,2),(2,3)])</pre></div>

訪問

node_list = G.nodes()
edge_list = G.edges()
#可以返回包含點與邊的列表
node = G.node[‘first_node’]
#如上根據key返回點
edge = G.edge['first_node']['second_node']
#同樣的方法,返回兩個key之間的邊</pre></div>

屬性

我們可以給圖,點,邊賦予各種屬性,最簡單的就是權值屬性
G.add_node(1,time='5pm')
#在添加時跟上屬性
G.add_nodes_from([1,2,3],time='5pm')
#批量添加點是,跟上統一的屬性
G.add_nodes_from([(3,{'time':'5pm'}), (4,{'time':'4pm'})])
#或者寫成元組列表[(key,dict),(key,dict)]的形式
G.node[1]['time']
#根據字典key訪問屬性值。

#給邊添加屬性也類似
G.add_edge(1,2,time='3am')
G.add_edges_from([(1,2,{'time'='5pm'}),(2,3,{'time'=3am})])
#批量賦予屬性
G.edge[1][2][‘time’]
#訪問

#我們還可以使用特定的函數批量返回屬性,如
time = nx.get_edge_attributes(G,'time')
#返回得到以元組為key,time屬性為值得一個字典
time[(1,2)]</pre></div>

圖算法

nx.connected_components(G)
#返回列表形式的G的全連通分量,每個分量一個子列表 
類似的,networkx還提供各種圖算法,具體可見官方文檔。

畫圖

nx.draw(G) #畫出圖G
matplotlib.show() #顯示出來
我們使用連通分量算法,並畫出一個簡單的圖如下:

networkx的默認屬性效果並不好, 我們根據文檔提供的借口設置合適的屬性,才能得到合適的圖。
networkx提供圖的點位置,大小,顏色,形狀,邊的顏色,類型等屬性可設置。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM