三、NetworkX工具包实战1——创建图、节点和连接【CS224W】(Datawhale组队学习)

news2024/9/28 13:25:00

请添加图片描述

开源内容:https://github.com/TommyZihao/zihao_course/tree/main/CS224W

子豪兄B 站视频:https://space.bilibili.com/1900783/channel/collectiondetail?sid=915098

斯坦福官方课程主页:https://web.stanford.edu/class/cs224w

NetworkX主页:https://networkx.org

文章目录

  • NetworkX创建图
    • 内置图
    • 连接表和邻接表创建图
  • NetworkX创建节点
  • NetworkX创建连接
  • 总结

NetworkX创建图

内置图

通过NetworkX自带的函数和API,创建内置的样例图,包括各种有向图、无向图、栅格图、随机图、社交网络,这里举几个常见的例子,更多例子见networkx创建图

经典图结构

plt.figure(figsize=(10,8), dpi=90)
#全连接无向图
plt.subplot(241)
G = nx.complete_graph(7)
nx.draw(G)
#全连接有向图
plt.subplot(242)
G = nx.complete_graph(7, nx.DiGraph())
nx.draw(G)
#环状图
plt.subplot(243)
G = nx.cycle_graph(5)
nx.draw(G)
#梯状图
plt.subplot(244)
G = nx.ladder_graph(5)
nx.draw(G)
#线性串珠图
plt.subplot(245)
G = nx.path_graph(15)
nx.draw(G)
#星状图
plt.subplot(246)
G = nx.star_graph(7)
nx.draw(G)
#轮辐图
plt.subplot(247)
G = nx.wheel_graph(8)
nx.draw(G)
#二项树
plt.subplot(248)
G = nx.binomial_tree(5)
nx.draw(G)

在这里插入图片描述
栅格图

plt.figure(figsize=(10,8), dpi=90)
# 二维矩形网格图
plt.subplot(231)
G = nx.grid_2d_graph(3,5)
nx.draw(G)
# 多维矩形网格图
plt.subplot(232)
G = nx.grid_graph(dim=(2, 3, 4))
nx.draw(G)
# 二维三角形网格图
plt.subplot(233)
G = nx.triangular_lattice_graph(2,5)
nx.draw(G)
# 二维六边形蜂窝图
plt.subplot(234)
G = nx.hexagonal_lattice_graph(2,3)
nx.draw(G)
# n维超立方体图
plt.subplot(235)
G = nx.hypercube_graph(4)
nx.draw(G)

在这里插入图片描述
NetworkX内置图

plt.figure(figsize=(10,8), dpi=90)

plt.subplot(241)
G = nx.diamond_graph()
nx.draw(G)

plt.subplot(242)
G = nx.bull_graph()
nx.draw(G)

plt.subplot(243)
G = nx.frucht_graph()
nx.draw(G)

plt.subplot(244)
G = nx.house_graph()
nx.draw(G)

plt.subplot(245)
G = nx.house_x_graph()
nx.draw(G)

plt.subplot(246)
G = nx.petersen_graph()
nx.draw(G)

plt.subplot(247)
G = nx.krackhardt_kite_graph()
nx.draw(G)

在这里插入图片描述
随机图

G = nx.erdos_renyi_graph(10, 0.5)
nx.draw(G)

在这里插入图片描述
社交网络
空手道俱乐部的人物关系

G = nx.karate_club_graph()
nx.draw(G, with_labels=True)

在这里插入图片描述
我们可以查看节点对应的俱乐部

print(G.nodes[5]["club"])
print(G.nodes[9]["club"])

在这里插入图片描述
雨果《悲惨世界》人物关系

G = nx.les_miserables_graph()
plt.figure(figsize=(12,10))
pos = nx.spring_layout(G, seed=10)
nx.draw(G, pos, with_labels=True)

在这里插入图片描述
社群聚类图

G = nx.caveman_graph(4, 3)
nx.draw(G, with_labels=True)

在这里插入图片描述

tree = nx.random_tree(n=10, seed=0)
print(nx.forest_str(tree, sources=[0]))

在这里插入图片描述

连接表和邻接表创建图

在NetworkX中,通过连接表和邻接表创建图。
首先配置所需要的环境

import networkx as nx
import numpy as np
import random # 随机数
import pandas as pd

# 数据可视化
import matplotlib.pyplot as plt
import matplotlib as mpl
%matplotlib inline
plt.rcParams['font.sans-serif']=['SimHei']  # 用来正常显示中文标签  
plt.rcParams['axes.unicode_minus']=False  # 用来正常显示负号
# windows操作系统
plt.rcParams['font.sans-serif']=['SimHei']  # 用来正常显示中文标签 
plt.rcParams['axes.unicode_minus']=False  # 用来正常显示负号

导入三元组连接表
数据来源:OpenKG-四大名著人物关系知识图谱和OWL本体:http://www.openkg.cn/dataset/ch4masterpieces

# 导入 csv 文件定义的三元组连接表,构建有向图
df = pd.read_csv('triples.csv')
df

在这里插入图片描述
通过连接表Edge List创建图

G = nx.DiGraph()
edges = [edge for edge in zip(df['head'], df['tail'])]
G.add_edges_from(edges)
G.edges('刘备')

OutEdgeDataView([(‘刘备’, ‘诸葛亮’), (‘刘备’, ‘马超’), (‘刘备’, ‘徐庶’), (‘刘备’, ‘姜维’), (‘刘备’, ‘糜芳’), (‘刘备’, ‘糜竺’), (‘刘备’, ‘魏延’), (‘刘备’, ‘赵云’), (‘刘备’, ‘黄忠’), (‘刘备’, ‘庞统’), (‘刘备’, ‘法正’), (‘刘备’, ‘蒋琬’), (‘刘备’, ‘马良’), (‘刘备’, ‘孟获’), (‘刘备’, ‘沙摩柯’)])

可视化

# 节点排版布局-默认弹簧布局
pos = nx.spring_layout(G, seed=123)
plt.figure(figsize=(15,12))
nx.draw(G, pos=pos, with_labels=True)

在这里插入图片描述
查看全图参数

print(G)
print(len(G))
print(G.size())
print(G.nodes)

DiGraph with 123 nodes and 144 edges
123
144
[‘关羽’, ‘刘备’, ‘张飞’, ‘张苞’, ‘关兴’, ‘关平’, ‘卢植’, ‘公孙瓒’, ‘甘氏’, ‘刘禅’, ‘诸葛瞻’, ‘诸葛亮’, ‘姜维’, ‘黄月英’, ‘黄承彦’, ‘诸葛瑾’, ‘公孙越’, ‘马超’, ‘马腾’, ‘韩遂’, ‘徐庶’, ‘曹操’, ‘刘胜’, ‘刘启’, ‘刘辩’, ‘孙权’, ‘孙尚香’, ‘糜氏’, ‘糜芳’, ‘糜竺’, ‘魏延’, ‘赵云’, ‘黄忠’, ‘庞统’, ‘法正’, ‘蒋琬’, ‘马良’, ‘孟获’, ‘沙摩柯’, ‘庞德公’, ‘马谡’, ‘祝融’, ‘孙韶’, ‘孙策’, ‘孙氏’, ‘陆逊’, ‘刘协’, ‘董卓’, ‘王允’, ‘貂蝉’, ‘吕布’, ‘丁原’, ‘高顺’, ‘陈宫’, ‘张辽’, ‘刘表’, ‘蔡氏’, ‘蔡瑁’, ‘蒯越’, ‘黄祖’, ‘文聘’, ‘张宝’, ‘张角’, ‘张梁’, ‘袁绍’, ‘袁术’, ‘袁谭’, ‘袁熙’, ‘袁尚’, ‘吴国太’, ‘孙坚’, ‘大乔’, ‘小乔’, ‘周瑜’, ‘丁奉’, ‘徐盛’, ‘鲁肃’, ‘张昭’, ‘蒋钦’, ‘太史慈’, ‘周泰’, ‘凌统’, ‘吕蒙’, ‘甘宁’, ‘黄盖’, ‘韩当’, ‘程普’, ‘曹嵩’, ‘吕伯奢’, ‘邹氏’, ‘张绣’, ‘清河公主’, ‘夏侯楙’, ‘夏侯渊’, ‘夏侯淳’, ‘曹真’, ‘曹爽’, ‘郭嘉’, ‘徐晃’, ‘乐进’, ‘张郃’, ‘许褚’, ‘典韦’, ‘荀彧’, ‘荀攸’, ‘贾诩’, ‘司马懿’, ‘程昱’, ‘于禁’, ‘邓艾’, ‘钟会’, ‘庞德’, ‘司马师’, ‘司马昭’, ‘司马炎’, ‘曹仁’, ‘曹纯’, ‘曹昂’, ‘刘氏’, ‘超昂’, ‘卞氏’, ‘曹丕’, ‘曹植’]

保存并载入邻接表 Adjacency List

# 将邻接表导出为本地文件 grid.edgelist
nx.write_edgelist(G, path="grid.edgelist", delimiter=":")
# 从本地文件 grid.edgelist 读取邻接表
H = nx.read_edgelist(path="grid.edgelist", delimiter=":")
# 可视化
plt.figure(figsize=(15,14))
pos = nx.spring_layout(H, iterations=3, seed=5)
nx.draw(H, pos, with_labels=True)
plt.show()

在这里插入图片描述

NetworkX创建节点

在NetworkX中创建单个节点、创建多个节点、图本身作为节点。
节点可以为任意可哈希的对象,比如字符串、图像、XML对象,甚至另一个Graph、自定义的节点对象。
通过这种方式,你可以根据你的应用,自由灵活地构建:图为节点、文件为节点、函数为节点,等灵活的图形式。

# 图数据挖掘
import networkx as nx

# 数据可视化
import matplotlib.pyplot as plt
%matplotlib inline

plt.rcParams['font.sans-serif']=['SimHei']  # 用来正常显示中文标签  
plt.rcParams['axes.unicode_minus']=False  # 用来正常显示负号

创建无节点、无连接的空图

G = nx.Graph()
G.nodes

NodeView(())

添加单个节点

G.add_node('刘备')
G.add_node('Tommy')
G.add_node(1)
G.nodes

NodeView((‘刘备’, ‘Tommy’, 1))

添加多个节点

G.add_nodes_from(['诸葛亮', '曹操'])
G.add_nodes_from(range(100, 105))
G.nodes

NodeView((‘刘备’, ‘Tommy’, 1, ‘诸葛亮’, ‘曹操’, 100, 101, 102, 103, 104))

添加带属性特征的节点

G.add_nodes_from([
    ('关羽',{'武器': '青龙偃月刀','武力值':90,'智力值':80}),
    ('张飞',{'武器': '丈八蛇矛','武力值':85,'智力值':75}),
    ('吕布',{'武器':'方天画戟','武力值':100,'智力值':70})
])
G.nodes
# 可视化
nx.draw(G)

NodeView((‘刘备’, ‘Tommy’, 1, ‘诸葛亮’, ‘曹操’, 100, 101, 102, 103, 104, ‘关羽’, ‘张飞’, ‘吕布’))
在这里插入图片描述

创建另一个首尾相连成串的Path Graph

H = nx.path_graph(10)
H.nodes
# 可视化
nx.draw(H)

NodeView((0, 1, 2, 3, 4, 5, 6, 7, 8, 9))
在这里插入图片描述

将H的节点添加到G中

G.add_nodes_from(H)
G.nodes

NodeView((‘刘备’, ‘Tommy’, 1, ‘诸葛亮’, ‘曹操’, 100, 101, 102, 103, 104, ‘关羽’, ‘张飞’, ‘吕布’, 0, 2, 3, 4, 5, 6, 7, 8, 9))

将H本身作为一个节点添加到G中

G.add_node(H)
G.nodes

NetworkX创建连接

在NetworkX中创建连接,设置连接的属性特征。

# 图数据挖掘
import networkx as nx
# 数据可视化
import matplotlib.pyplot as plt
%matplotlib inline
# plt.rcParams['font.sans-serif']=['SimHei']  # 用来正常显示中文标签  
plt.rcParams['axes.unicode_minus']=False  # 用来正常显示负号

首先我们要先创建一个图

# 创建无向图
G = nx.Graph()

# 给整张图添加特征属性
G.graph['Name'] = 'HelloWorld'

# 创建有向图
H = nx.DiGraph()

接下来我们给图添加节点

# 创建0号节点,并添加特征属性
G.add_node(0, feature=5, label=0, zihao=2)
G.add_nodes_from([
  (1, {'feature': 1, 'label': 1, 'zihao':3}),
  (2, {'feature': 2, 'label': 2, 'zihao':4})
])
# 遍历所有节点,data=True 表示输出节点特征属性信息
for node in G.nodes(data=True):
    print(node)

(0, {‘feature’: 5, ‘label’: 0, ‘zihao’: 2})
(1, {‘feature’: 1, ‘label’: 1, ‘zihao’: 3})
(2, {‘feature’: 2, ‘label’: 2, ‘zihao’: 4})

创建单个连接,设置属性特征
特征属性的名字可以随便起

G.add_edge(0, 1, weight=0.5, like=3)

创建多个连接

G.add_edges_from([
  (1, 2, {'weight': 0.3, 'like':5}),
  (2, 0, {'weight': 0.1, 'like':8})
])
G.edges[(0, 1)]
#可视化
nx.draw(G, with_labels = True)

{‘weight’: 0.5, ‘like’: 3}
在这里插入图片描述

全图连接信息

print(G.number_of_edges())
print(G.size())
print(G.edges())
print(G.edges(data=True))
# 遍历所有连接,data=True 表示输出连接特征属性信息
for edge in G.edges(data=True):
    print(edge)

3
3
[(0, 1), (0, 2), (1, 2)]
[(0, 1, {‘weight’: 0.5, ‘like’: 3}), (0, 2, {‘weight’: 0.1, ‘like’: 8}), (1, 2, {‘weight’: 0.3, ‘like’: 5})]
(0, 1, {‘weight’: 0.5, ‘like’: 3})
(0, 2, {‘weight’: 0.1, ‘like’: 8})
(1, 2, {‘weight’: 0.3, ‘like’: 5})

节点的连接数(Node Degree)

# 指定节点
node_id = 1
print("节点{}的度为{}".format(node_id,G.degree[node_id]))
# 指定节点的所有相邻节点
for neighbor in G.neighbors(node_id):
    print("Node {} has neighbor {}".format(node_id, neighbor))

节点1的度为2
Node 1 has neighbor 0
Node 1 has neighbor 2

总结

本篇文章主要介绍了如何通过NetworkX工具包创建图、节点和连接。
通过NetworkX自带的函数和API,创建内置的样例图,包括各种有向图、无向图、栅格图、随机图、社交网络。
在NetworkX中创建单个节点、创建多个节点、图本身作为节点。
在NetworkX中创建连接,设置连接的属性特征。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/353998.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RFID射频识别技术(四) RFID高频电路基础|课堂笔记|10月11日

2022年10月11日 week7 ​​​​​​​ 目录 ​​​​​​​ 第四讲: RFID高频电路基础 一、RLC(串联)电路的阻抗

人工智能时代- 是时候改变学习方法了!

一、背景 现在 ChatGPT 非常火爆,很多问题能够给出非常专业的回答,对我们的学习有一些帮助。 今天突发奇想,问问 ChatGPT 一个问题:“Java 程序员如何做到让自己的代码更具有拓展性?” 下面将贴出 ChatGPT 相关的人…

上市公司企业持续创新能力、创新可持续性(原始数据+计算代码+计算结果)(2008-2021年)

数据来源:自主计算 时间跨度:2008-2021年 区域范围:沪深A股上市公司 指标说明: 参考何郁冰(2017)[1]的做法,将持续创新作为独立研究变量,同时采用创新投入指标(研发经费) 和创新…

【AHK】打开网络连接/打开wifi列表/打开蓝牙列表

需求:打开wifi列表检查自动连接的wifi,打开蓝牙列表查看蓝牙设备电量,并通过快捷键激活,能像wink那样打开连接列表。 同时也是一种思路,就是一般是输入 Windows打开xx的快捷键,一般是找不到的,那…

Apache Flink 实时计算在美的多业务场景下的应用与实践

摘要:本文整理自美的集团实时数据负责人、资深数据架构师董奇,在 Flink Forward Asia 2022 主会场的分享。本篇内容主要分为四个部分:实时生态系统在美的的发展和建设现状核心传统业务场景 Flink 实时数字化转型实践新兴业务场景 Flink 实时数…

Ubuntu最新版本(Ubuntu22.04LTS)安装nfs服务器及使用教程

目录 一、概述 二、在Ubuntu搭建nfs服务器  👉2.1 安装nfs服务器  👉2.2 创建nfs服务器共享目录  👉2.3 修改nfs服务器配置文件  👉2.4 重启nfs服务器 三、客户端访问nfs服务器共享目录  🎈3.1 在nfs客户端挂载服…

Tile防丢器引入全新防盗模式,苹果Find My功能拓展到大众消费电子

Tile 宣布引入全新的防盗模式,Tile 配件启用之后,反跟踪扫描和安全功能就无法检测到该配件。Tile 为了遏制其物品追踪产品用于追踪某人,此前推出了 Scan and Secure 功能。iPhone 和安卓用户可以通过该功能扫描附近的 Tile 设备,以…

【C++之容器篇】map和set常见函数接口的使用与剖析

目录前言一、set1. 简介2. 成员类型3. 构造函数(1) set()(2)set(InputIterator first,InputIterator last)(3)使用4. 拷贝构造函数和赋值运算符重载5. empty()6. size()7. insert()(1)pair<iterator,bool> insert(const K& key)(2)iterator insert(iterator pos,cons…

零信任-Cisco思科零信任介绍(10)

​目录 ​思科零信任介绍 思科零信任所涉及产品 思科零信任架构拓扑介绍 ​思科零信任框架VS零信任安全框架 思科零信任架构的应用场景 思科零信任解决方案的优势 思科零信任的未来发展展望 思科零信任介绍 Cisco Zero Trust是思科公司推广的一种安全模型&#xff0c;旨…

实现qq群消息接收和发送功能

QQWebsocketClient是什么 实现qq群消息接收和发送功能&#xff0c;基于websocket技术和cqhttp服务开发 一、 效果截图 二、实现思路 使用cqhttp进行socket反向代理&#xff0c;获取qq聊天的所有消息 编写java客户端&#xff0c;连接至cqhttp服务器获取聊天消息 获取聊天消…

spring boot 自动配置类,详细过程

springboot version(v2.7.8)启动类SpringBootApplication public class SecurityApplication { public static void main(String[] args) {SpringApplication.run(SecurityApplication.class, args);} }1 点击 SpringBootApplication进入&#xff0c;EnableAutoConfiguration 开…

把Typora图片自动上传网

闲话少说 总共三步下载PicGohttps://github.com/Molunerfinn/PicGo/releases/download/v2.3.1/PicGo-Setup-2.3.1-x64.exe直接点就行这里略过Gitee我们需要使用 Git 来保存我们的图片&#xff0c;又因为国内访问 Github 速度比较慢&#xff0c;所以这里推荐使用国内的 Git 托管…

Blazor入门100天 : 身份验证和授权 (1) - 建立带身份验证工程

目录 建立默认带身份验证 Blazor 程序角色/组件/特性/过程逻辑DB 改 Sqlite将自定义字段添加到用户表脚手架拉取IDS文件,本地化资源freesql 生成实体类,freesql 管理ids数据表初始化 Roles,freesql 外键 > 导航属性完善 freesql 和 bb 特性 知识点 Microsoft.AspNetCore.…

数据结构与算法之数组寻找峰值分而治之

这一篇分享一道在数组中寻找峰值的题目&#xff0c;使用到分而治之&#xff0c;二分查找等思想。本文章会讲解这个二分查找的本质&#xff0c;以及为什么要用二分查找&#xff0c;它能解决哪一类题目&#xff1f;目录&#xff1a;一.题目及其要求1.分而治之2.题目思路3.具体做法…

渗透测试实战 - 外网渗透内网穿透(超详细)

文章目录实验环境Target1 - Centos7 &#xff08;web服务&#xff09;Target2 - Ubuntu &#xff08;内网web服务&#xff09;Target3 - Windows7 (客户端)实验目的实验步骤测试Target1信息收集22/21端口 弱口令爆破(MSF&#xff0c;hydra)3306端口8888端口80端口主机信息收集反…

在AWS Glue上使用JDBC连接Trino

呼应此前一篇文章《在Spark上使用JDBC连接Trino》&#xff0c;继续在AWS Glue上测试JDBC连接Trino&#xff0c;同样&#xff0c;这是一个非常不典型的应用用场景&#xff0c;本文仅记录测试步骤和结果&#xff0c;不做评论。本文地址&#xff1a;https://laurence.blog.csdn.ne…

还在想假期去哪玩?直接做一个旅游攻略小程序

憋了几年好不容易解封准备出去散散心,但看着大江南北这么多景点是不是有点让你选择强迫症呢?那就先制作一个旅游攻略小程序看看驴友们的分享吧。

E. Explosions?(思维+单调队列

Problem - E - Codeforces 题意&#xff1a;有 n 个怪&#xff0c;生命值为&#xff0c;你有两种操作&#xff0c;一种花费 1 MP减少一个怪的一格血量&#xff0c;可以操作任意次&#xff1b;另一次是花费 x MP&#xff0c;制造一个爆炸&#xff0c;可以不断消灭两侧连续严格递…

【C语言】 详谈指针

☃️内容专栏&#xff1a;【C语言】初阶部分 ☃️本文概括&#xff1a;继初识C语言&#xff0c;对C语言指针初阶部分进行归纳与总结。 ☃️本文作者&#xff1a;花香碟自来_ ☃️发布时间&#xff1a;2023.2.17 目录 一、指针和指针类型 1.1 指针 1.2 指针类型 其一&#x…

运动耳机选择什么模式?运动耳机的正确选择

动是生命的源泉&#xff0c;有许多朋友都会在运动的时候戴上一个运动耳机。因为运动时听音乐会给我们带来充足的动力&#xff0c;但是选择一款合适自己的运动耳机也是一门学问&#xff0c;今天我就来给大家推荐几款还不错的运动耳机。 1、NANK南卡RunnerPro4骨传导运动耳机 骨…