networkX用法整


無向圖,有向圖,加權圖等例子代碼 【http://www.cnblogs.com/kaituorensheng/p/5423131.html#_label1】
數據分析學習筆記(三)-NetworkX的使用 【http://baiyejianxin.iteye.com/blog/1764048】
官網文檔 【https://networkx.readthedocs.io/en/stable/overview.html】http://networkx.github.io/documentation/networkx-1.7/index.html】
NetworkX使用筆記:讀入外部文件並轉換成各種格式 【http://sparkandshine.net/networkx-use-notes-read-external-file-convert-to-other-formats/】
————————————————————————————————-

1.安裝

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

2.使用

networkx的英文版說明可以在其官方網站上下載得到,寫的簡單易懂。
http://networkx.github.io/documentation/latest/reference/index.html
這里記錄下一些簡單的建圖方法。
在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)])

訪問

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

屬性

我們可以給圖,點,邊賦予各種屬性,最簡單的就是權值屬性

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.node1['time’] #根據字典key訪問屬性值。

給邊添加屬性也類似

G.add_edge(1,2,time='3am’)
G.add_edges_from([(1,2,{'time’='5pm’}),(2,3,{'time’=3am})]) #批量賦予屬性
G.edge1[2][‘time’] #訪問

我們還可以使用特定的函數批量返回屬性,如

time = nx.get_edge_attributes(G,'time’) #返回得到以元組為key,time屬性為值得一個字典
time[(1,2)]

圖算法

nx.connected_components(G) #返回列表形式的G的全連通分量,每個分量一個子列表

類似的,networkx還提供各種圖算法,具體可見官方文檔。
畫圖

nx.draw(G) #畫出圖G
matplotlib.show() #顯示出來
————————————————————————————————-

import networkx as nx
import matplotlib.pyplot as plt

計算1:求無向圖的任意兩點間的最短路徑

G = nx.Graph()
G.add_edges_from([(1,2),(1,3),(1,4),(1,5),(4,5),(4,6),(5,6)])
path = nx.all_pairs_shortest_path(G)
print(path1)

計算2:求出圖中在環上的點

G = nx.Graph()
G.add_edges_from([(1,2),(1,3),(1,4),(1,5),(4,5),(4,6),(5,6)])
path = nx.all_pairs_shortest_path(G)
print(path1)

path=nx.all_pairs_shortest_path(G) #調用多源最短路徑算法,計算圖G所有節點間的最短路徑
print(path0[2]) #輸出節點0、2之間的最短路徑序列: [0, 1, 2]


免責聲明!

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



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