Python 學習筆記之 networkx 使用

介紹 networkx

networkx 支持創建簡單無向圖、有向圖和多重圖;內置許多標準的圖論算法,節點可為任意數據;支持任意的邊值維度,功能豐富,簡單易用

networkx 中的 Graph

Graph 的定義

Graph 是用點和線來刻畫離散事物集合中的每對事物間以某種方式相聯系的數學模型

網絡作為圖的一個重要領域,包含的概念與定義更多,如有向圖網絡、無向圖網絡等

Graph 在現實世界中隨處可見,如交通運輸圖、旅游圖、流程圖等。此處我們只考慮由點和線所組成的圖

Graph 的結構

一個 Graph 包含一個節點集合和一個邊集

networkx 中,一個節點可以是任意 hash 對象(除了 None 對象),一條邊也可以關聯任意的對象,像一個文本字符串,一幅圖像,一個 XML 對象,甚至是另一個圖或任意定制的節點對象

總結 :

  1. Python 中的 None 對象是不可以作為節點的類型的
  2. networkx 中,節點與邊能夠存儲任意類型字典的屬性和任意其他豐富類型的數據

Graph 的分類

  • Graph:指無向圖(undirected Graph),即忽略了兩個節點間連邊的方向
  • DiGraph:指有向圖(directed Graph),即考慮了兩個節點之間連邊的有向性
  • MultiGraph:指多重無向圖,即兩個結點之間的邊數多于一條,又允許頂點通過同一條邊和自己關聯(即允許重邊和自環
  • MultiDiGraph:多重有向圖
g = nx.Graph()  # 無向圖
dg = nx.DiGraph()  # 有向圖
mg = nx.MultiGraph()  # 多重無向圖
mdg = nx.MultiDiGraph()  # 多重有向圖
g.clear()  # 清空圖

networkx 語法

節點操作

添加節點

如果添加的節點和邊是已經存在的,是不會報錯的, networkx 會自動忽略掉已經存在的邊和節點的添加

import networkx as nx
import matplotlib.pyplot as pltG = nx.Graph()                 # 建立一個空的無向圖G
G.add_node('a')                  # 添加一個節點a
G.add_nodes_from(['b','c','d','e'])    # 從一個列表中添加節點
H = nx.path_graph(10)          # 返回由10個節點挨個連接的無向圖,有9條邊
G.add_nodes_from(H)            # 創建一個子圖H加入G
G.add_node(H)                  # 直接將圖作為節點nx.draw(G, with_labels=True)
plt.show()print('圖中所有的節點', G.nodes())
print('圖中節點的個數', G.number_of_nodes())

圖1

刪除節點
# 刪除節點
G.remove_node(1)    # 刪除指定節點
G.remove_nodes_from(['b','c','d','e'])   # 刪除列表中的節點
nx.draw(G, with_labels=True)
plt.show()

圖2

邊操作

添加邊
# 添加邊
F = nx.Graph()      # 創建無向圖
F.add_edge(11,12)   # 指定節點之間添加一條邊
# 等價于
e=(13,14)        # e 是一個元組
F.add_edge(*e)   # python 中解包的過程F.add_edges_from([(1,2),(1,3)])     # 通過 list 來添加多條邊# 通過一個圖的邊來添加邊
H = nx.path_graph(10)          # 返回由10個節點挨個連接的無向圖,有9條邊
F.add_edges_from(H.edges()) # 不能寫作F.add_edges_from(H)nx.draw(F, with_labels=True)
plt.show()print('圖中所有的邊', F.edges())
print('圖中邊的個數', F.number_of_edges()) 

圖3

遍歷邊
# 快速遍歷每一條邊,可以使用鄰接迭代器實現,對于無向圖,每一條邊相當于兩條有向邊
G1 = nx.Graph()
G1.add_weighted_edges_from([(1,2,0.125), (1,3,0.75), (2,4,1.2), (3,4,0.275)])
for n, nbrs in G1.adjacency():for nbr, eattr in nbrs.items():data = eattr['weight']print('(%d, %d, %0.3f)' % (n,nbr,data))print('***********************************')# 篩選 weight 小于0.5的邊:
G2 = nx.Graph()
G2.add_weighted_edges_from([(1,2,0.125), (1,3,0.75), (2,4,1.2), (3,4,0.275)])
for n, nbrs in G2.adjacency():for nbr, eattr in nbrs.items():data = eattr['weight']if data < 0.5:print('(%d, %d, %0.3f)' % (n,nbr,data))
print('***********************************')# 一種方便的訪問所有邊的方法:
for u,v,d in G2.edges(data = 'weight'):print((u,v,d))

輸出:

(1, 2, 0.125)
(1, 3, 0.750)
(2, 1, 0.125)
(2, 4, 1.200)
(3, 1, 0.750)
(3, 4, 0.275)
(4, 2, 1.200)
(4, 3, 0.275)
***********************************
(1, 2, 0.125)
(2, 1, 0.125)
(3, 4, 0.275)
(4, 3, 0.275)
***********************************
(1, 2, 0.125)
(1, 3, 0.75)
(2, 4, 1.2)
(3, 4, 0.275)
刪除邊
# 刪除邊
F.remove_edge(1,2)
F.remove_edges_from([(11,12), (13,14)])nx.draw(F, with_labels=True)
plt.show()

屬性操作

屬性諸如 weight, labels, colors, 或者任何對象,你都可以附加到圖、節點或邊上。

對于每一個圖、節點和邊都可以在關聯的屬性字典中保存一個(多個)鍵-值對。

默認情況下這些是一個空的字典,但是我們可以增加或者是改變這些屬性

# 圖的屬性
G = nx.Graph(day='Monday')    # 可以在創建圖時分配圖的屬性
print(G.graph)
G.graph['day'] = 'Friday'     # 也可以修改已有的屬性
print(G.graph)
G.graph['name'] = 'time'      # 可以隨時添加新的屬性到圖中
print(G.graph)

輸出:

{'day': 'Monday'}
{'day': 'Friday'}
{'day': 'Friday', 'name': 'time'}
# 節點的屬性
G = nx.Graph(day='Monday')
G.add_node(1, index='1th')             # 在添加節點時分配節點屬性
print(G.nodes(data=True))
G.nodes[1]['index'] = '0th'             # 通過G.nodes[][]來添加或修改屬性
print(G.nodes(data=True))
G.add_nodes_from([2,3], index='2/3th')  # 從列表中添加節點時分配屬性
print(G.nodes(data=True))

輸出:

[(1, {'index': '1th'})]
[(1, {'index': '0th'})]
[(1, {'index': '0th'}), (2, {'index': '2/3th'}), (3, {'index': '2/3th'})]
# 邊的屬性
G = nx.Graph(day='manday')
G.add_edge(1,2,weight=10)                    # 在添加邊時分配屬性
print(G.edges(data=True))
G.add_edges_from([(1,3), (4,5)], len=22)     # 從集合中添加邊時分配屬性
print(G.edges(data='len'))
G.add_edges_from([(3,4,{'hight':10}),(1,4,{'high':'unknow'})])
print(G.edges(data=True))
G[1][2]['weight'] = 100000                   # 通過G[][][]來添加或修改屬性
print(G.edges(data=True))

輸出:

[(1, 2, {'weight': 10})]
[(1, 2, None), (1, 3, 22), (4, 5, 22)]
[(1, 2, {'weight': 10}), (1, 3, {'len': 22}), (1, 4, {'high': 'unknow'}), (3, 4, {'hight': 10}), (4, 5, {'len': 22})]
[(1, 2, {'weight': 100000}), (1, 3, {'len': 22}), (1, 4, {'high': 'unknow'}), (3, 4, {'hight': 10}), (4, 5, {'len': 22})]

圖轉化

# 有向圖轉化成無向圖
H = DG.to_undirected()
# 或者
H = nx.Graph(DG)# 無向圖轉化成有向圖
F = H.to_directed()
# 或者
F = nx.DiGraph(H)

其他操作

degree(G[, nbunch, weight]):返回單個節點或nbunch節點的度數視圖。

degree_histogram(G):返回每個度值的頻率列表。

density(G):返回圖的密度。

info(G[, n]):打印圖G或節點n的簡短信息摘要。

create_empty_copy(G[, with_data]):返回圖G刪除所有的邊的拷貝。

is_directed(G):如果圖是有向的,返回true。

add_star(G_to_add_to, nodes_for_star, **attr):在圖形G_to_add_to上添加一個星形。

add_path(G_to_add_to, nodes_for_path, **attr):在圖G_to_add_to中添加一條路徑。

add_cycle(G_to_add_to, nodes_for_cycle, **attr):向圖形G_to_add_to添加一個循環。

節點

nodes(G):在圖節點上返回一個迭代器。

number_of_nodes(G):返回圖中節點的數量。

all_neighbors(graph, node):返回圖中節點的所有鄰居。

non_neighbors(graph, node):返回圖中沒有鄰居的節點。

common_neighbors(G, u, v):返回圖中兩個節點的公共鄰居。

edges(G[, nbunch]):返回與nbunch中的節點相關的邊的視圖。

number_of_edges(G):返回圖中邊的數目。

non_edges(graph):返回圖中不存在的邊。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/215424.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/215424.shtml
英文地址,請注明出處:http://en.pswp.cn/news/215424.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

張馳咨詢:數據驅動的質量改進,六西格瑪綠帶在汽車業實踐

尊敬的汽車行業同仁們&#xff0c;您是否曾面臨生產效率低下、成本不斷攀升或顧客滿意度下降的困擾&#xff1f;本期專欄&#xff0c;我們將深入探討如何通過六西格瑪綠帶培訓&#xff0c;在汽車行業中實現過程優化和質量提升。 汽車行業的競爭日趨激烈&#xff0c;致力于提供…

3.cloud-Consul服務注冊與發現

1.官網 https://learn.hashicorp.com/consul/getting-started/install.html 2.訂單服務 2.1 POM <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependenc…

學習Java第66天,路徑問題

相對路徑情況分析 相對路徑情況1:web/index.html中引入web/static/img/logo.png 訪問index.html的url為 : http://localhost:8080/web03_war_exploded/index.html 當前資源為 : index.html 當前資源的所在路徑為 : http://localhost:8080/web03_war_exploded/ 要獲取的目標資…

【華為數據之道學習筆記】3-9元數據治理面臨的挑戰

華為在進行元數據治理以前&#xff0c;遇到的元數據問題主要表現為數據找不到、讀不懂、不可信&#xff0c;數據分析師們往往會陷入數據沼澤中&#xff0c;例如以下常見的場景。 某子公司需要從發貨數據里對設備保修和維保進行區分&#xff0c;用來不對過保設備進行服務場景分析…

Qt 使用百度的離線地圖

使用百度離線地圖&#xff0c;一下載百度離線包&#xff08;offlinemap&#xff09;&#xff1b;二是準備地圖瓦片&#xff08;不同級別的瓦片&#xff09;&#xff1b;三 準備&#xff48;&#xff54;&#xff4d;&#xff4c;主頁面&#xff1b;四&#xff0c;&#xff31;&…

深度學習 Day13——P2彩色圖片分類

&#x1f368; 本文為&#x1f517;365天深度學習訓練營 中的學習記錄博客&#x1f356; 原作者&#xff1a;K同學啊 | 接輔導、項目定制 文章目錄 前言1 我的環境2 代碼實現與執行結果2.1 前期準備2.1.1 引入庫2.1.2 設置GPU&#xff08;如果設備上支持GPU就使用GPU,否則使用C…

在Go中定義方法

引言 函數允許你將邏輯組織到可重復的過程中,每次運行時可以使用不同的參數。在定義函數的過程中,你會經常發現多個函數可能每次都操作同一段數據。Go可以識別這種模式,并允許您定義特殊的函數,稱為方法,其目的是對某些特定類型的實例進行操作,稱為接收器。為類型添加方…

nodejs微信小程序+python+PHP基于spark的酒店管理系統-計算機畢業設計推薦

目 錄 摘 要 I ABSTRACT II 目 錄 II 第1章 緒論 1 1.1背景及意義 1 1.2 國內外研究概況 1 1.3 研究的內容 1 第2章 相關技術 3 2.1 nodejs簡介 4 2.2 express框架介紹 6 2.4 MySQL數據庫 4 第3章 系統分析 5 3.1 需求分析 5 3.2 系統可行性分析 5 3.2.1技術可行性&#xff1a;…

排序算法——歸并排序

歸并排序&#xff08;Merge Sort&#xff09;是計算機科學中非常重要的排序算法之一。它不僅高效、穩定&#xff0c;而且是許多高級排序技術和算法思想的基礎。在本文中&#xff0c;我們將深入探討歸并排序的原理、實現方法&#xff0c;以及它的優缺點。 1. 歸并排序的原理 歸…

Python大模型TensorFlow/PyTorch/Scikit-learn/Keras/OpenCV/Gensim

Python 作為一種高級編程語言&#xff0c;可以用于開發各種大小的模型。以下是一些常見的 Python 大模型&#xff0c;以及它們的優勢、劣勢和使用場景&#xff1a; TensorFlow&#xff1a; 優勢&#xff1a;TensorFlow 是一個非常流行的深度學習庫&#xff0c;具有高度的可擴…

階段五:深度學習和人工智能(掌握使用TensorFlow或PyTorch進行深度學習)

掌握使用TensorFlow或PyTorch進行深度學習需要具備一定的編程基礎和數學基礎&#xff0c;包括編程語言、數據結構、算法、線性代數、概率論和統計學等方面的知識。以下是掌握使用TensorFlow或PyTorch進行深度學習的一些基本要求&#xff1a; 了解深度學習的基本概念和原理&…

目標檢測YOLO系列從入門到精通技術詳解100篇-【目標檢測】計算機視覺(基礎篇)

目錄 前言 幾個高頻面試題目 計算機視覺中常見的錯誤及解決方案 1.翻轉圖像和關鍵點

AnotherRedisDesktopManager安裝使用 (redis可視化客戶端)

下載 下載地址 AnotherRedisDesktopManager 發行版 - Gitee.com 安裝 雙擊安裝 修改安裝路徑 運行

pt36項目短信OAth2.0

5、短信驗證碼 1、注冊容聯云賬號&#xff0c;登錄并查看開發文檔&#xff08;以下分析來自接口文檔&#xff09; 2、開發文檔【準備1】&#xff1a;請求URL地址1.示例&#xff1a;https://app.cloopen.com:8883/2013-12-26/Accounts/{}/SMS/TemplateSMS?sig{}ACCOUNT SID# s…

Docker安裝與使用

Docker 1.初識Docker Docker如何解決大型項目依賴關系復雜&#xff0c;不同組件依賴的兼容性問題&#xff1f; Docker允許開發中將應用、依賴、函數庫、配置一起打包&#xff0c;形成可移植鏡像Docker應用運行在容器中&#xff0c;使用沙箱機制&#xff0c;相互隔離 Docker…

phpstorm中使用 phpunit 時的配置和代碼覆蓋率測試注意點

初始化一個composer項目&#xff0c;composer.json配置文件如下 {"name": "zingfront/questions-php","type": "project","require": {"php": "^7.4"},"require-dev": {"phpunit/phpun…

geemap學習筆記024:從Earth Engine中獲取遙感圖像的縮略圖

前言 遙感圖像的縮略圖通常是以較小的數據量對整景影像有一個全面的展示&#xff0c;便于分享和觀察&#xff0c;本節就介紹一下如何獲取遙感圖像的縮略圖。 1 導入庫并顯示地圖 import ee import geemap import osee.Initialize() Map geemap.Map() Map2 加載數據 roi e…

多維時序 | MATLAB實現RIME-CNN-BiLSTM-Multihead-Attention多頭注意力機制多變量時間序列預測

多維時序 | MATLAB實現RIME-CNN-BiLSTM-Multihead-Attention多頭注意力機制多變量時間序列預測 目錄 多維時序 | MATLAB實現RIME-CNN-BiLSTM-Multihead-Attention多頭注意力機制多變量時間序列預測預測效果基本介紹模型描述程序設計參考資料 預測效果 基本介紹 MATLAB實現RIME-…

項目管理工具:選品開發管理的最佳實踐

Zoho Projects是一個功能強大的項目管理工具&#xff0c;可以幫助電商企業實現選品開發過程的有序管理&#xff0c;提升選品開發效率。 以下是使用Zoho Projects進行選品開發管理的步驟&#xff1a; 1.創建項目&#xff1a; 登錄Zoho Projects&#xff0c;在主頁上點擊"新…

NSSCTF Crypto靶場練習,21-30wp

文章目錄 [AFCTF 2018]你能看出這是什么加密么[LitCTF 2023]你是我的關鍵詞(Keyworld)[NSSCTF 2022 Spring Recruit]classic[SWPUCTF 2021 新生賽]crypto4[LitCTF 2023]家人們&#xff01;誰懂啊&#xff0c;RSA簽到都不會 (初級)[SWPUCTF 2021 新生賽]crypto5[LitCTF 2023]Is …