亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python networkx包的實現(xiàn)

 更新時間:2020年02月14日 11:34:47   作者:悅光陰  
這篇文章主要介紹了Python networkx包的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

networkx是Python的一個包,用于構(gòu)建和操作復(fù)雜的圖結(jié)構(gòu),提供分析圖的算法。圖是由頂點、邊和可選的屬性構(gòu)成的數(shù)據(jù)結(jié)構(gòu),頂點表示數(shù)據(jù),邊是由兩個頂點唯一確定的,表示兩個頂點之間的關(guān)系。頂點和邊也可以擁有更多的屬性,以存儲更多的信息。

對于networkx創(chuàng)建的無向圖,允許一條邊的兩個頂點是相同的,即允許出現(xiàn)自循環(huán),但是不允許兩個頂點之間存在多條邊,即出現(xiàn)平行邊。邊和頂點都可以有自定義的屬性,屬性稱作邊和頂點的數(shù)據(jù),每一個屬性都是一個Key:Value對。

一,創(chuàng)建圖

在創(chuàng)建圖之前,需要導(dǎo)入networkx模塊,通常設(shè)置別名為nx;如果創(chuàng)建的圖中,頂點之間的邊沒有方向,那么該圖稱作無向圖。在創(chuàng)建圖時,可以通過help(g)來獲得圖的幫助文檔。

import networkx as nx

g=nx.Graph()#創(chuàng)建空的無向圖
g=nx.DiGraph()#創(chuàng)建空的有向圖

二,圖的頂點

圖中的每一個頂點Node都有一個關(guān)鍵的ID屬性,用于唯一標(biāo)識一個節(jié)點,ID屬性可以整數(shù)或字符類型;頂點除了ID屬性之外,還可以自定義其他的屬性。

1,向圖中增加頂點

在向圖中增加頂點時,可以一次增加一個頂點,也可以一次性增加多個頂點,頂點的ID屬性是必需的。在添加頂點之后,可以通過g.nodes()函數(shù)獲得圖的所有頂點的視圖,返回的實際上NodeView對象;如果為g.nodes(data=True)的data參數(shù)設(shè)置為true,那么返回的是NodeDataView對象,該對象不僅包含每個頂點的ID屬性,還包括頂點的其他屬性。

g.add_node(1)
g.add_nodes_from([2,3,4])
g.nodes()
#NodeView((1, 2,3,4))

在向圖中添加頂點時,除ID屬性之外,也可以向頂點中增加自定義的屬性,例如,名稱屬性,權(quán)重屬性:

>>> g.add_node(1,name='n1',weight=1)
>>> g.add_node(2,name='n2',weight=1.2)

2,查看頂點的屬性

通過屬性_node獲得圖的所有頂點和屬性的信息,_node屬性返回的是一個字典結(jié)構(gòu),字典的Key屬性是頂點的ID屬性,Value屬性是頂點的其他屬性構(gòu)成的一個字典。

>>> g._node
{1: {'name': 'n1', 'weight': 1}, 2: {'name': 'n2', 'weight': 1.2}, 3: {}, 4: {}}
>>>g.nodes(data=True)

可以通過頂點的ID屬性來查看頂點的其他屬性:

>>> g.node[1]
{'name': 'n1', 'weight': 1}
>>> g.node[1]['name']
'n1 new'

通過g.nodes(),按照特定的條件來查看頂點:

 >>> list(g.nodes(data=True))
 [(1, {'time': '5pm'}), (3, {'time': '2pm'})]

3,刪除頂點

通過remove函數(shù)刪除圖的頂點,由于頂點的ID屬性能夠唯一標(biāo)識一個頂點,通常刪除頂點都需要通過傳遞ID屬性作為參數(shù)。

g.remove_node(node_ID)
g.remove_nodes_from(nodes_list)

4,更新頂點

更新圖的頂點,有兩種方式,第一種方式使用字典結(jié)構(gòu)的_update函數(shù),第二種方式是通過索引來設(shè)置新值:

>>> g._node[1].update({'name':'n1 new'})
>>> g.node[1]['name']='n1 new'
{1: {'name': 'n1 new', 'weight': 1}, 2: {'name': 'n2', 'weight': 1.2}, 3: {}, 4: {}}

5,刪除頂點的屬性

使用del命令刪除頂點的屬性

del g.nodes[1]['room'] 

6,檢查是否存在頂點

檢查一個頂點是否存在于圖中,可以使用 n in g方式來判斷,也可以使用函數(shù):

g.has_node(n)

三,圖的邊

圖的邊用于表示兩個頂點之間的關(guān)系,因此,邊是由兩個頂點唯一確定的。為了表示復(fù)雜的關(guān)系,通常會為邊增加一個權(quán)重weight屬性;為了表示關(guān)系的類型,也會設(shè)置為邊設(shè)置一個關(guān)系屬性。

1,向圖中增加邊

邊是由對應(yīng)頂點的名稱構(gòu)成的,例如,頂點2和3之間有一條邊,記作e=(2,3),通過add_edge(node1,node2)向圖中添加一條邊,也可以通過add_edges_from(list)向圖中添加多條邊;在添加邊時,如果頂點不存在,那么networkx會自動把相應(yīng)的頂點加入到圖中。

g.add_edge(2,3)
g.add_edges_from([(1,2),(1,3)])
g.edges()
#EdgeView([(1, 2), (1, 3), (2, 3)])

可以向邊中增加屬性,例如,權(quán)重,關(guān)系等:

g.add_edge(1, 2, weight=4.7, relationship='renew')

由于在圖中,邊的權(quán)重weight是非常有用和常用的屬性,因此,networkx模塊內(nèi)置以一個函數(shù),專門用于在添加邊時設(shè)置邊的權(quán)重,該函數(shù)的參數(shù)是三元組,前兩個字段是頂點的ID屬性,用于標(biāo)識一個邊,第三個字段是邊的權(quán)重:

g.add_weighted_edges_from([(1,2,0.125),(1,3,0.75),(2,4,1.2),(3,4,0.375)])

在增加邊時,也可以一次增加多條邊,為不同的邊設(shè)置不同的屬性:

g.add_edges_from([(1,2,{'color':'blue'}), (2,3,{'weight':8})])

2,查看邊的屬性

查看邊的屬性,就是查看邊的數(shù)據(jù)(data),查看所有邊及其屬性:

>>> g.edges(data=True)
EdgeDataView([(1, 2, {}), (1, 3, {}), (2, 3, {})])

查看特定的邊的信息有兩種方式:

>>> g[1][2]
>>> g.get_edge_data(1,2)
{'weight': 0.125, 'relationship': 'renew', 'color': 'blue'}

3,刪除邊

邊是兩個頂點的ID屬性構(gòu)成的元組,通過 edge=(node1,node2) 來標(biāo)識邊,進而從圖中找到邊:

g.remove_edge(edge)
g.remove_edges_from(edges_list)

4,更新邊的屬性

通過邊來更新邊的屬性,由兩種方式,一種是使用update函數(shù),一種是通過屬性賦值來實現(xiàn):

g[1][2]['weight'] = 4.7
g.edge[1][2]['weight'] = 4
g[1][2].update({"weight": 4.7})
g.edges[1, 2].update({"weight": 4.7})  

5,刪除邊的屬性

通過 del命令來刪除邊的屬性

del g[1][2]['name']

6,檢查邊是否存在

檢查一條邊是否存在于圖中

g.has_edge(1,2)

四,圖的屬性

圖的屬性主要是指相鄰數(shù)據(jù),節(jié)點和邊。

1,adj

ajd返回的是一個AdjacencyView視圖,該視圖是頂點的相鄰的頂點和頂點的屬性,用于顯示用于存儲與頂點相鄰的頂點的數(shù)據(jù),這是一個只讀的字典結(jié)構(gòu),Key是頂點,Value是頂點的屬性數(shù)據(jù)。

>>> g.adj[1][2]
{'weight': 0.125, 'relationship': 'renew', 'color': 'blue'}
>>> g.adj[1]
AtlasView({2: {'weight': 0.125, 'relationship': 'renew', 'color': 'blue'}, 3: {'weight': 0.75}})

2,edges

圖的邊是由邊的兩個頂點唯一確定的,邊還有一定的屬性,因此,邊是由兩個頂點和邊的屬性構(gòu)成的:

>>> g.edges
EdgeView([(1, 2), (1, 3), (2, 3), (2, 4), (3, 4)])
>>> g.edges.data()
EdgeDataView([(1, 2, {'weight': 0.125, 'relationship': 'renew', 'color': 'blue'}), 
(1, 3, {'weight': 0.75}), 
(2, 3, {'weight': 8}), 
(2, 4, {'weight': 1.2}), 
(3, 4, {'weight': 0.375})])

EdgeView僅僅提供邊的信息,可以通過屬性g.edges或函數(shù)g.edges()來獲得圖的邊視圖。

EdgeDataView提供圖的邊和邊的屬性,可以通過EdgeView對象來調(diào)用data()函數(shù)獲得。

3,nodes

圖的頂點是頂點和頂點的屬性構(gòu)成的

>>> g.nodes
NodeView((1, 2, 3, 4))
>>> g.nodes.data()
NodeDataView({1: {'name': 'n1 new', 'weight': 1}, 2: {'name': 'n2', 'weight': 1.2}, 3: {}, 4: {}})

NodeView 通過屬性g.nodes或函數(shù)g.nodes()來獲得。

NodeDataView提供圖的邊和邊的屬性,可以通過NodeView對象來調(diào)用data()函數(shù)獲得。

4,degree

對于無向圖,頂點的度是指跟頂點相連的邊的數(shù)量;對于有向圖,頂點的圖分為入度和出度,朝向頂點的邊稱作入度;背向頂點的邊稱作出度。

通過g.degree 或g.degree()能夠獲得DegreeView對象,

五,圖的遍歷

 圖的遍歷是指按照圖中各頂點之間的邊,從圖中的任一頂點出發(fā),對圖中的所有頂點訪問一次且只訪問一次。圖的遍歷按照優(yōu)先順序的不同,通常分為深度優(yōu)先搜索(DFS)和廣度優(yōu)先搜索(BFS)兩種方式。

1,查看頂點的相鄰頂點

查看頂點的相鄰頂點,有多種方式,例如,以下代碼都用于返回頂點1的相鄰頂點,g[n]表示圖g中,與頂點n相鄰的所有頂點:

g[n]
g.adj[n]
g.neighbors(n)

其中,g.neighbors(n)是g.adj[n]的迭代器版本。

2,查看圖的相鄰

該函數(shù)返回頂點n和相鄰的節(jié)點信息:

>>> for n, nbrs in g.adjacency():
...   print(n)
...   print(nbrs)

3,圖的遍歷

深度優(yōu)先遍歷的算法:

  • 首先以一個未被訪問過的頂點作為起始頂點,沿當(dāng)前頂點的邊走到未訪問過的相鄰頂點;
  • 當(dāng)當(dāng)前頂點沒有未訪問過的相鄰頂點時,則回到上一個頂點,繼續(xù)試探別的相鄰頂點,直到所有的頂點都被訪問過。

深度優(yōu)先遍歷算法的思想是:從一個頂點出發(fā),一條路走到底;如果此路走不通,就返回上一個頂點,繼續(xù)走其他路。

廣度優(yōu)先遍歷的算法:

  • 從頂點v出發(fā),依次訪問v的各個未訪問過的相鄰頂點;
  • 分別從這些相鄰頂點出發(fā)依次訪問它們的相鄰頂點;

廣度優(yōu)先遍歷算法的思想是:以v為起點,按照路徑的長度,由近至遠(yuǎn),依次訪問和v有路徑相通且路徑長度為1,2...,n的頂點。

在進行圖遍歷時,需要訪問頂點的相鄰頂點,這需要用到adjacency()函數(shù),例如,g是一個無向圖,n是頂點,nbrs是頂點n的相鄰頂點,是一個字典結(jié)構(gòu)

for n,nbrs in g.adjacency(): 
  print (n, nbrs)
  for nbr,attr in nbrs.items():
    # nbr表示跟n連接的頂點,attr表示這兩個點連邊的屬性集合
    print(nbr,attr)

六,繪制Graph

使用networkx模塊draw()函數(shù)構(gòu)造graph,使用matplotlib把圖顯示出來:

nx.draw(g)

import matplotlib.pyplot as plt
plt.show()

修改頂點和邊的顏色:

g = nx.cubical_graph()
nx.draw(g, pos=nx.spectral_layout(g), nodecolor='r', edge_color='b')
plt.show()

完整的示例如下面的代碼所示:

from matplotlib import pyplot as plt
import networkx as nx
g=nx.Graph()
g.add_nodes_from([1,2,3])
g.add_edges_from([(1,2),(1,3)])
nx.draw_networkx(g)
plt.show()

七,計算每個頂點的PageRank值

每個頂點的PageRank(簡稱PR)值,是訪問頂點的概率,可以通過networkx.pagerank()函數(shù)來計算,該函數(shù)根據(jù)頂點的入邊和邊的權(quán)重來計算頂點的PR值,也就是說,PR值跟頂點的入邊有關(guān),跟入邊的weight(權(quán)重)屬性有關(guān):

pagerank(g, alpha=0.85, personalization=None, max_iter=100, tol=1e-06, nstart=None, weight='weight', dangling=None)

常用參數(shù)注釋:

  • g:無向圖會被轉(zhuǎn)換為有向圖,一條無向邊轉(zhuǎn)換為兩條有向邊;
  • alpha:阻尼參數(shù),默認(rèn)值是0.85,取值范圍為 0 到 1, 代表從圖中某一特定點指向其他任意點的概率;
  • weight:默認(rèn)值是weight,表示使用edge的weight屬性作為權(quán)重,如果沒有指定,那么把edge的權(quán)重設(shè)置為1;

1,舉個例子

例如,創(chuàng)建一個有向圖,由三個頂點(A、B和C),兩條邊(A指向B,A指向C),邊的權(quán)重都是0.5

g=nx.DiGraph()
g.add_weighted_edges_from([('A','B',0.5),('A','C',0.5)])
print( nx.pagerank(g))
#{'A': 0.259740259292235, 'C': 0.3701298703538825, 'B': 0.3701298703538825}

修改邊的權(quán)重,并查看頂點的PR值:

g['A']['C']['weight']=1
print( nx.pagerank(g))  
# {'A': 0.259740259292235, 'C': 0.40692640737443164, 'B': 0.3333333333333333}

2,查看各個頂點的PR值

根據(jù)圖來創(chuàng)建PageRank,并查看各個頂點的PageRank值

pr=nx.pagerank(g)
#page_rank_value=pr[node]
for node, pageRankValue in pr.items():
  print("%s,%.4f" %(node,pageRankValue))

參考文檔:

python networkx 包繪制復(fù)雜網(wǎng)絡(luò)關(guān)系圖

社會網(wǎng)絡(luò)分析與挖掘---Python之networkx介紹

python之networkx庫小結(jié)

python復(fù)雜網(wǎng)絡(luò)分析庫NetworkX

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • python數(shù)據(jù)寫入列表并導(dǎo)出折線圖

    python數(shù)據(jù)寫入列表并導(dǎo)出折線圖

    這篇文章主要介紹了python數(shù)據(jù)寫入列表并導(dǎo)出折線圖,文章以舉例展開對文章主題的介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-01-01
  • 教你安裝python Django(圖文)

    教你安裝python Django(圖文)

    web開發(fā)語言越來越多,本文是安裝python Django,看完之后就可以使用PYTHON做開發(fā)了。
    2013-11-11
  • python操作字典類型的常用方法(推薦)

    python操作字典類型的常用方法(推薦)

    下面小編就為大家?guī)硪黄猵ython操作字典類型的常用方法(推薦)。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考,一起跟隨小編過來看看吧
    2016-05-05
  • python 除法保留兩位小數(shù)點的方法

    python 除法保留兩位小數(shù)點的方法

    今天小編就為大家分享一篇python 除法保留兩位小數(shù)點的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • python基礎(chǔ)教程之自定義函數(shù)介紹

    python基礎(chǔ)教程之自定義函數(shù)介紹

    這篇文章主要介紹了python基礎(chǔ)教程之自定義函數(shù)介紹,本文講解了python中函數(shù)的定義方法、函數(shù)參數(shù)的定義方法,需要的朋友可以參考下
    2014-08-08
  • Python映射拆分操作符用法實例

    Python映射拆分操作符用法實例

    這篇文章主要介紹了Python映射拆分操作符用法,實例分析了Python映射拆分操作符**的使用技巧,需要的朋友可以參考下
    2015-05-05
  • 通過代碼實例了解Python3編程技巧

    通過代碼實例了解Python3編程技巧

    這篇文章主要介紹了通過代碼實例了解Python3編程技巧,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10
  • 利用Python獲取操作系統(tǒng)信息實例

    利用Python獲取操作系統(tǒng)信息實例

    作為一個運維人員,經(jīng)常需要獲取系統(tǒng)的的各種信息,使用python會很方便幫助獲得,這篇文章運用實例告訴大家如何利用Python來獲取操作系統(tǒng)的信息,有需要的可以參考借鑒。
    2016-09-09
  • Python離線安裝openpyxl模塊的步驟

    Python離線安裝openpyxl模塊的步驟

    這篇文章主要介紹了Python離線安裝openpyxl模塊的步驟,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • pytorch中 gpu與gpu、gpu與cpu 在load時相互轉(zhuǎn)化操作

    pytorch中 gpu與gpu、gpu與cpu 在load時相互轉(zhuǎn)化操作

    這篇文章主要介紹了pytorch模型載入之gpu和cpu互轉(zhuǎn)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05

最新評論