<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          NetworkX使用手冊(cè)

          共 6450字,需瀏覽 13分鐘

           ·

          2021-12-02 10:50


          介紹

          NetworkX是一款Python的軟件包,用于創(chuàng)造、操作復(fù)雜網(wǎng)絡(luò),以及學(xué)習(xí)復(fù)雜網(wǎng)絡(luò)的結(jié)構(gòu)、動(dòng)力學(xué)及其功能。?有了NetworkX你就可以用標(biāo)準(zhǔn)或者不標(biāo)準(zhǔn)的數(shù)據(jù)格式加載或者存儲(chǔ)網(wǎng)絡(luò),它可以產(chǎn)生許多種類(lèi)的隨機(jī)網(wǎng)絡(luò)或經(jīng)典網(wǎng)絡(luò),也可以分析網(wǎng)絡(luò)結(jié)構(gòu),建立網(wǎng)絡(luò)模型,設(shè)計(jì)新的網(wǎng)絡(luò)算法,繪制網(wǎng)絡(luò)等等。?如果在此之前你還不太了解Python,戳這里——>

          安裝

          其實(shí)如果要用NetworkX來(lái)進(jìn)行復(fù)雜網(wǎng)絡(luò)的編程還離不開(kāi)許多相關(guān)的其他Python庫(kù),我們可以去官網(wǎng)根據(jù)需求一一安裝,有詳細(xì)的安裝說(shuō)明。這里推薦一種超級(jí)方便實(shí)用的方法,即安裝Anaconda,Anaconda包含了許多實(shí)用的常用Python庫(kù),你就不需要再一一自己安裝了。請(qǐng)參考。(Anaconda是跨平臺(tái)的Windows和Linux都支持)

          基本使用

          (下面實(shí)驗(yàn)如果沒(méi)有特殊說(shuō)明,都是在Ubuntu下使用Visual Studio Code實(shí)驗(yàn)的)

          • 創(chuàng)建一個(gè)圖 ?首先創(chuàng)建一個(gè)空的圖

            import networkx as nx
            G = nx.Graph()

            根據(jù)圖的定義,一個(gè)圖包含一個(gè)節(jié)點(diǎn)集合和一個(gè)邊集。在NetworkX中,節(jié)點(diǎn)可以是任何哈希對(duì)象,像一個(gè)文本字符串,一幅圖像,一個(gè)XML對(duì)象,甚至是另一個(gè)圖或任意定制的節(jié)點(diǎn)對(duì)象。(注意,Python中的None對(duì)象是不可以作為節(jié)點(diǎn)的類(lèi)型的。)

          • 節(jié)點(diǎn) ?圖G可以通過(guò)好幾種方式生成。NetworkX包含了許多圖的產(chǎn)生函數(shù)和一些讀寫(xiě)圖的工具。我們可以通過(guò)一些簡(jiǎn)單的操作開(kāi)始 ?最簡(jiǎn)單的我們一次添加一個(gè)節(jié)點(diǎn):

            `G.add_node(1)`

            也可以從一個(gè)list中添加節(jié)點(diǎn):?

            `G.add_nodes_from([2, 3])`

            或者從**nbunch**中添加節(jié)點(diǎn),nbunch是任何可迭代的節(jié)點(diǎn)容器(如list、set、graph、file等),nbunch本身不是圖中的一個(gè)節(jié)點(diǎn)。

            H=nx.path_graph(10) #H是一個(gè)有10個(gè)節(jié)點(diǎn)的鏈狀圖,即有n個(gè)節(jié)點(diǎn)n-1條邊的連通圖
            G.add_nodes_from(H) #或者G.add_nodes_from(H.nodes())

            此時(shí)圖G中就包含了圖H中的10個(gè)節(jié)點(diǎn)。作為比較,我們可以使圖H作為圖G的一個(gè)節(jié)點(diǎn):

            `G.add_node(H)`

            現(xiàn)在圖G就包含了一個(gè)節(jié)點(diǎn)H,即該節(jié)點(diǎn)是一個(gè)圖。可以看到這種靈活性是非常強(qiáng)大的,它允許圖的圖,文件的圖,函數(shù)的圖等等。因此我們應(yīng)該好好思考如何構(gòu)建我們的應(yīng)用程序才能使我們的節(jié)點(diǎn)是有用的實(shí)體。當(dāng)然我們可以在圖中使用一個(gè)唯一的標(biāo)識(shí)符或者使用一個(gè)不同的字典的鍵來(lái)標(biāo)識(shí)節(jié)點(diǎn)信息。(如果該hash依賴于它的內(nèi)容,則我們不應(yīng)該改變節(jié)點(diǎn)對(duì)象)

          • 邊 ?一個(gè)圖G可以通過(guò)一次添加一條邊來(lái)構(gòu)成:

            G.add_edge(1,2)

            #等價(jià)于


            e=(1,2) #e是一個(gè)元組
            G.add_edge(*e) #這是python中解包裹的過(guò)程

            也可以通過(guò)添加list來(lái)添加多條邊:

            G.add_edges_from([(1,2),(1,3)])

            或者通過(guò)添加任何ebunch來(lái)添加邊,一個(gè)ebunch是任何可迭代的邊的元組,一個(gè)邊的元組可以是兩個(gè)節(jié)點(diǎn)之間的一個(gè)2元組(無(wú)權(quán)值的邊)或者3元組(3元組還有一個(gè)元素是邊的權(quán)值,比如(1,2,{‘weight’:100}))。下面將進(jìn)一步討論邊的屬性:

            G.add_edges_from(H.edges()) #不能寫(xiě)作G.add_edges_from(H)

            我們可以用類(lèi)似的方法拆除圖:G.remove_node(),G.remove_nodes_from(),G.remove_edge(),G.remove_edges_from() ?比如:

            G.remove_node(H)

            如果你添加的節(jié)點(diǎn)和邊是已經(jīng)存在的,是不會(huì)報(bào)錯(cuò)的。比如,我們先將圖G里的所有節(jié)點(diǎn)和邊刪除:

            G.clear()

            然后我們新的節(jié)點(diǎn)和邊,NetworkX會(huì)自動(dòng)忽略掉已經(jīng)存在的邊和節(jié)點(diǎn)的添加:

            G.add_edges_from([(1,2),(1,3)])
            G.add_node(1)
            G.add_edge(1,2)
            G.add_node("spam") #添加節(jié)點(diǎn)"spam"
            G.add_nodes_from("spam") #添加節(jié)點(diǎn)'s' 'p' 'a' 'm'

            此時(shí)圖G一共有8個(gè)節(jié)點(diǎn)和2條邊。?我們可以通過(guò)如下函數(shù)查看:

            print G.number_of_nodes()
            print G.number_of_edges()

            此時(shí)對(duì)應(yīng)的網(wǎng)絡(luò)G的圖形為:? ?我們還可以查閱當(dāng)前圖G的實(shí)際情況:? 當(dāng)我們通過(guò)某一種圖類(lèi)創(chuàng)建一個(gè)圖形結(jié)構(gòu)的實(shí)例時(shí),我們可以指定好幾種不同格式的數(shù)據(jù): ? ?可以看到將圖G轉(zhuǎn)化為有向圖賦給H之后,有向圖H由無(wú)向圖G中的兩條無(wú)向邊轉(zhuǎn)變?yōu)?條有向邊。后面一個(gè)例子是將list直接傳到類(lèi)Graph中,創(chuàng)建由list中的邊組成的無(wú)向圖H。

          • - 節(jié)點(diǎn)和邊的使用 ?你可能已經(jīng)注意到在NetworkX中節(jié)點(diǎn)和邊并沒(méi)有被指定一個(gè)對(duì)象,因此你就可以自由地指定節(jié)點(diǎn)和邊的對(duì)象。最常見(jiàn)的對(duì)象是數(shù)值和字符串,但是一個(gè)節(jié)點(diǎn)可以是任意hash對(duì)象(除了None對(duì)象),一條邊也可以關(guān)聯(lián)任意的對(duì)象x,比如:G.add_edge(a,b,object=x)。?舉個(gè)關(guān)于邊關(guān)聯(lián)對(duì)象的例子,加入a和b是兩個(gè)人,而他們兩個(gè)人之間的聯(lián)系(邊),可以是一個(gè)概率,即邊的對(duì)象是一個(gè)概率值,表示這兩個(gè)人之間每天通電話的可能性。?可以看到這是十分強(qiáng)大而且有用的,但是如果你濫用該方法將會(huì)導(dǎo)致意想不到的后果,除非你對(duì)Python真的很熟悉。如果你不是很確定,你可以考慮使用conver_node_label_to_integers(),他可以將一個(gè)圖的所有節(jié)點(diǎn)按順序轉(zhuǎn)化為整數(shù)對(duì)象賦給另一個(gè)圖。- 訪問(wèn)邊 ?除了上面的提到的那些訪問(wèn)節(jié)點(diǎn)和邊的方法以外( eg: Graph.nodes(),Graph.edges(),Graph.neighbors()…),當(dāng)你只是想想要遍歷它們時(shí),迭代的版本(eg: Graph.edges_iter())可以省去返回它們時(shí)創(chuàng)建如此很大的一個(gè)表去存儲(chǔ)它們。快速直接的訪問(wèn)圖的數(shù)據(jù)結(jié)構(gòu)可以通過(guò)下表來(lái)實(shí)現(xiàn)。?(注意:不要去改變返回的字典,因?yàn)樗菆D數(shù)據(jù)結(jié)構(gòu)中的一部分,直接的操作可能導(dǎo)致圖處于一個(gè)不一致的狀態(tài)。) ?

          • ?但是我們可以很安全的去改變一條已存在的邊的屬性(權(quán)值):?

          • 如果想要快速遍歷每一條邊,我們可以使用鄰接迭代器實(shí)現(xiàn),對(duì)于無(wú)向圖,每一條邊相當(dāng)于兩條有向邊:?

          • ?(add_weight_edges_from函數(shù)的作用是通過(guò)一個(gè)ebunch添加一些節(jié)點(diǎn)和邊,邊默認(rèn)其屬性為”weight”) ?說(shuō)明:其實(shí)FG.adjacency_iter()返回的是一個(gè)所有節(jié)點(diǎn)的二元組(node, adjacency dict)的迭代器,比如上述代碼中對(duì)于節(jié)點(diǎn)1返回的是:(1,{2:{0.125},3:{0.75}})。?一種方便的訪問(wèn)所有邊的方法: ?


          • 給圖、節(jié)點(diǎn)和邊添加屬性 ?屬性諸如weight,labels,colors,或者任何對(duì)象,你都可以附加到圖、節(jié)點(diǎn)或邊上。?對(duì)于每一個(gè)圖、節(jié)點(diǎn)和邊都可以在關(guān)聯(lián)的屬性字典中保存一個(gè)(多個(gè))鍵-值對(duì)。默認(rèn)情況下這些是一個(gè)空的字典,但是我們可以增加或者是改變這些屬性通過(guò)使用add_edge,add_node或者字典操作這些屬性字典,比如G.graph,G.node或者G.edge。


            • 通過(guò)讀取存儲(chǔ)在文件中的一些標(biāo)準(zhǔn)圖形格式,例如邊表,鄰接表,GML,GraphML,pickle,LEAD或者其他的一些格式:
            • 使用隨機(jī)圖發(fā)生器
            • 使用一些圖形生成器
            • 使用典型的圖形操作:subgraph(G, nbunch) - 產(chǎn)生nbunch節(jié)點(diǎn)的子圖 ?union(G1,G2) - 結(jié)合圖 ?disjoint_union(G1,G2) - 假設(shè)所有節(jié)點(diǎn)都不同,然后結(jié)合圖 ?cartesian_product(G1,G2) - 返回笛卡爾乘積圖 ?compose(G1,G2) - 結(jié)合兩個(gè)圖并表示兩者共同的節(jié)點(diǎn) ?complement(G) - 圖G的補(bǔ)圖 ?create_empty_copy(G) - 返回同一類(lèi)圖的無(wú)邊副本 ?convert_to_undirected(G) - 返回G的無(wú)向圖 ?convert_to_directed(G) - 返回G的有向圖- 調(diào)用經(jīng)典的小圖
            • - 圖的屬性 ?可以在創(chuàng)建圖時(shí)分配圖的屬性:?

            • ?你也可以修改已有的屬性:?

            • ?你也可以隨時(shí)添加新的屬性到圖中:?

            • - 節(jié)點(diǎn)的屬性 ?通過(guò)add_node(),add_nodes_from給節(jié)點(diǎn)添加屬性或者G.node[][]來(lái)修改屬性(前面兩種在添加的是已存在的節(jié)點(diǎn)時(shí),也可以看做是修改節(jié)點(diǎn)屬性 ):?

            • ?注意添加一個(gè)節(jié)點(diǎn)是G.add_node而不是G.node。- 邊點(diǎn)的屬性 ?通過(guò)add_edge(),add_edges_from()來(lái)添加邊的屬性,下表或者G.edge[][][]來(lái)修改屬性。?

            • ?注意:注意什么時(shí)候使用‘=’,什么時(shí)候使用‘:’;什么時(shí)候有引號(hào)什么時(shí)候沒(méi)有引號(hào)。?特殊屬性weight應(yīng)該是一個(gè)數(shù)值型的,并且在算法需要使用weight時(shí)保存該數(shù)值。有向圖 ?DiGraph類(lèi)提供了許多有向圖中的額外算法,比如DiGraph.out_edges(),DiGraph.in_degree(),DiGraph.predecessors(),DiGraph.successors()等。為了讓算法可以在兩類(lèi)圖中都可以工作,無(wú)向圖中的neighbors()和degree()分別等價(jià)于有向圖中的successors()和有向圖中的in_degree()和out_degree()的和。雖然這樣有時(shí)候會(huì)讓我們感覺(jué)不太一致。?


            • 有些算法只能在有向圖中使用,而有些圖并沒(méi)有為有向圖定義。確實(shí)將有向圖和無(wú)向圖混在在一起是很危險(xiǎn)的一件事情,所以,如果有些實(shí)驗(yàn)?zāi)阆氚岩粋€(gè)有向圖看做一個(gè)無(wú)向圖,你可以將有向圖轉(zhuǎn)化為無(wú)向圖,通過(guò):

              H=DG.to_undirected()

              #或者

              H=nx.Graph(DG)

              多圖(Multigraphs) ?NetworkX提供了一個(gè)類(lèi),它可以允許任何一對(duì)節(jié)點(diǎn)之間有多條邊。類(lèi)MultiGraph和類(lèi)MultiDiGraph允許添加相同的邊兩次,這兩條邊可能附帶不同的權(quán)值。對(duì)于有些應(yīng)用程序這是非常有用的類(lèi),但是許多算法不能夠很好的在這樣的圖中定義,比如最短路徑算法,但是像MultiGraph.degree這種算法又可以很好的被定義。否則你應(yīng)該為了很好的定義測(cè)量,而將圖轉(zhuǎn)化為標(biāo)準(zhǔn)的圖。?

              圖的生成器和圖的操作 ?除了通過(guò)節(jié)點(diǎn)和邊生成圖,也可以通過(guò)以下方法產(chǎn)生:

              petersen=nx.petersen_graph()
              tutte=nx.tutte_graph()
              maze=nx.sedgewick_maze_graph()
              tet=nx.tetrahedral_graph()
              K_5=nx.complete_graph(5)
              K_3_5=nx.complete_bipartite_graph(3,5)
              barbell=nx.barbell_graph(10,10)
              lollipop=nx.lollipop_graph(10,20)
              er=nx.erdos_renyi_graph(100,0.15)
              ws=nx.watts_strogatz_graph(30,3,0.1)
              ba=nx.barabasi_albert_graph(100,5)
              red=nx.random_lobster(100,0.9,0.9)
              nx.write_gml(red,"path.to.file")
              mygraph=nx.read_gml("path.to.file")

              詳細(xì)的圖的格式請(qǐng)參考官網(wǎng):?詳細(xì)的圖的產(chǎn)生函數(shù)請(qǐng)參考官網(wǎng):

              分析圖 ?圖G的結(jié)構(gòu)可以通過(guò)各種圖論的函數(shù)來(lái)分析,例如:

              >>>?G=nx.Graph()
              >>>?G.add_edges_from([(1,2),(1,3)])
              >>>?G.add_node("spam")???????#?adds?node?"spam"

              >>>?nx.connected_components(G)
              [[1,?2,?3],?['spam']]

              >>>?sorted(nx.degree(G).values())
              [0,?1,?1,?2]

              >>>?nx.clustering(G)
              {1:?0.0,?2:?0.0,?3:?0.0,?'spam':?0.0}

              返回節(jié)點(diǎn)屬性的函數(shù)是通過(guò)返回一個(gè)以節(jié)點(diǎn)為鍵的字典來(lái)實(shí)現(xiàn)的:

              >>>?nx.degree(G)
              {1:?2,?2:?1,?3:?1,?'spam':?0}

              對(duì)于一些特定節(jié)點(diǎn)的值,我們可以提供該特定節(jié)點(diǎn)(集)的nbunch作為函數(shù)參數(shù)。如果被指定的是單個(gè)節(jié)點(diǎn),則返回一個(gè)對(duì)應(yīng)的單一的值,如果被指定的是一個(gè)nbunch,則返回一個(gè)字典:

              >>>?nx.degree(G,1)
              2
              >>>?G.degree(1)
              2
              >>>?G.degree([1,2])
              {1:?2,?2:?1}
              >>>?sorted(G.degree([1,2]).values())
              [1,?2]
              >>>?sorted(G.degree().values())
              [0,?1,?1,?2]

              繪制圖 ?NetworkX并不是專門(mén)用來(lái)繪圖的包,但是Matplotlib以及一些接口卻提供了很好的繪圖功能。Python3.0以上的版本可能不能很好的兼容NetworkX中的繪圖包。

              首先我們導(dǎo)入Matplotlib的plot接口(pylab也可以)

              import?matplotlib.pyplot?as?plt

              #或者

              import?matplotlib.pylab?as?plt

              你可能會(huì)發(fā)現(xiàn)使用“ipthon -pylab”q去交互測(cè)試代碼是很有用的,它提供了強(qiáng)大的ipython和matplotlib,也提供了一個(gè)方便的交互模式。

              測(cè)試networkx.drawing是是否導(dǎo)入成功,可以通過(guò):

              nx.draw(G)
              nx.draw_random(G)
              nx.draw_circular(G)
              nx.draw_spectral(G)

              你要將這個(gè)圖形繪制到屏幕,你可能需要Matplotlib:

              plt.show()

              如果你不需要顯示,那你可以將圖像保存到一個(gè)文件:

              nx.draw(G)
              plt.savefig("path.png")

              最基礎(chǔ)的NetworkX的介紹和使用說(shuō)明到這里就先結(jié)束了,后期還會(huì)繼續(xù)學(xué)習(xí)更深入的NetworkX和復(fù)雜網(wǎng)絡(luò)相結(jié)合的相關(guān)用法。




          Python“寶藏級(jí)”公眾號(hào)【Python之王】專注于Python領(lǐng)域,會(huì)爬蟲(chóng),數(shù)分,C++,tensorflow和Pytorch等等

          近 2年共原創(chuàng) 100+ 篇技術(shù)文章。創(chuàng)作的精品文章系列有:

          日常收集整理了一批不錯(cuò)的?Python?學(xué)習(xí)資料,有需要的小伙可以自行免費(fèi)領(lǐng)取。

          獲取方式如下:公眾號(hào)回復(fù)資料領(lǐng)取Python等系列筆記,項(xiàng)目,書(shū)籍,直接套上模板就可以用了。資料包含算法、python、算法小抄、力扣刷題手冊(cè)和 C++ 等學(xué)習(xí)資料!


          瀏覽 78
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  黄片免费高清 | 秘 看片黄全部免费 | 一级二级麻豆视频 | 高清无码在线视频 | 蜜桃成人网站 |