networkx学习(一) 图论

news2025/1/12 3:54:41

1.创建一个简单网络(图)

# 导入库
import networkx as nx
import matplotlib.pyplot as plt
# 创建一个空图
G = nx.Graph()
# 向该图中添加节点和连边
G.add_nodes_from([1,2,3,4])
G.add_edges_from([(1,2),(1,3),(2,3),(2,4)])
# 可视化图
nx.draw(G, node_size=500, node_color='red', with_labels=True)
plt.savefig("fig1.png", dpi=300)

在这里插入图片描述

2.获取网络(图)的邻接矩阵

在这里插入图片描述

import networkx as nx

# 无向无权
G = nx.Graph()
G.add_nodes_from([1,2,3,4])
G.add_edges_from([(1,2),(1,3),(2,3),(2,4)])
As = nx.adjacency_matrix(G)
print(As)
C:\Users\24365\AppData\Local\Temp\ipykernel_16576\36223340.py:1: FutureWarning: adjacency_matrix will return a scipy.sparse array instead of a matrix in Networkx 3.0.
  As = nx.adjacency_matrix(G)


  (0, 1)	1
  (0, 2)	1
  (1, 0)	1
  (1, 2)	1
  (1, 3)	1
  (2, 0)	1
  (2, 1)	1
  (3, 1)	1

注意:对于networkx2.6以后的版本(如2.7,2.8)无法正常打印As,
会出现:FutureWarning: adjacency_matrix will return a
scipy.sparse array instead of a matrix in Networkx 3.0.
但并不影响获取邻接矩阵。

# 获取二维邻接矩阵
A = As.todense()
A
matrix([[0, 1, 1, 0],
        [1, 0, 1, 1],
        [1, 1, 0, 0],
        [0, 1, 0, 0]], dtype=int32)
# 有向无权
G = nx.DiGraph()
G.add_nodes_from([1,2,3,4])
G.add_edges_from([(1,2),(2,3),(3,1),(2,4)])
As = nx.adjacency_matrix(G)
A = As.todense()
A
C:\Users\24365\AppData\Local\Temp\ipykernel_16576\1709250573.py:5: FutureWarning: adjacency_matrix will return a scipy.sparse array instead of a matrix in Networkx 3.0.
  As = nx.adjacency_matrix(G)





matrix([[0, 1, 0, 0],
        [0, 0, 1, 1],
        [1, 0, 0, 0],
        [0, 0, 0, 0]], dtype=int32)
# 无向加权
G = nx.Graph()
G.add_nodes_from([1,2,3,4])
G.add_weighted_edges_from([(1,2,2.0),(2,3,0.5),(3,1,1.0),(2,4,4.0)])
As = nx.adjacency_matrix(G)
A = As.todense()
A
C:\Users\24365\AppData\Local\Temp\ipykernel_16576\2025817479.py:5: FutureWarning: adjacency_matrix will return a scipy.sparse array instead of a matrix in Networkx 3.0.
  As = nx.adjacency_matrix(G)





matrix([[0. , 2. , 1. , 0. ],
        [2. , 0. , 0.5, 4. ],
        [1. , 0.5, 0. , 0. ],
        [0. , 4. , 0. , 0. ]])
# 无向带自环
G = nx.Graph()
G.add_nodes_from([1,2,3,4])
G.add_edges_from([(1,1),(1,2),(2,3),(3,1),(2,4),(4,4)])
As = nx.adjacency_matrix(G)
A = As.todense()
A
C:\Users\24365\AppData\Local\Temp\ipykernel_16576\3477799048.py:5: FutureWarning: adjacency_matrix will return a scipy.sparse array instead of a matrix in Networkx 3.0.
  As = nx.adjacency_matrix(G)





matrix([[1, 1, 1, 0],
        [1, 0, 1, 1],
        [1, 1, 0, 0],
        [0, 1, 0, 1]], dtype=int32)

3.已知邻接矩阵A,生成A对应的网络

import networkx as nx
import numpy as np
# 小规模矩阵
A = np.array([[0, 1, 1, 0],
              [1, 0, 1, 1],
              [1, 1, 0, 0],
              [0, 1, 0, 0]], dtype=int)
G = nx.from_numpy_array(A)
nx.draw(G, with_labels=True)

在这里插入图片描述

# 有向网络的情况也是类似的
DA = np.array([[0, 1, 1, 0],
              [0, 0, 1, 1],
              [1, 1, 0, 0],
              [0, 0, 0, 0]], dtype=int)
DG = nx.from_numpy_array(DA, create_using=nx.DiGraph())
nx.draw(DG, with_labels=True)

在这里插入图片描述

# 读取外部邻接矩阵数据
# import pandas as pd
# df = pd.read_csv("adjacency_matrix.csv", header=None, index_col=None)
# G = nx.from_pandas_adjacency(df)
# 若为有向网络
# G = nx.from_pandas_adjacency(df, create_using=nx.DiGraph())

4.度、平均度以及度分布

我们使用ki表示网络中第i个节点的度

度分布pk表示“网络中随机选出的一个节点其度为k”的概率

< k >表示平均度

在这里插入图片描述

import networkx as nx
import numpy as np


4.1、无向无权网络

# 创建空图
G = nx.Graph()
# 添加节点
G.add_nodes_from([1,2,3,4])
# 添加边
G.add_edges_from([(1,2),(2,3),(2,4),(3,4)])
# 获取网络G的度
d = dict(nx.degree(G))
print(d)
# 获取网络G的平均度
print("平均度为:", 2*len(G.edges())/len(G.nodes))
# 或采用如下方式
print("平均度为:", sum(d.values())/len(G.nodes))

# 获取度值出现的频数:返回所有位于区间[0, dmax]的度值的频率列表
nx.degree_histogram(G)
{1: 1, 2: 3, 3: 2, 4: 2}
平均度为: 2.0
平均度为: 2.0





[0, 1, 2, 1]

绘制度分布直方图

# 导入绘图库
import matplotlib.pyplot as plt
x = list(range(max(d.values())+1))
y = [i/len(G.nodes) for i in nx.degree_histogram(G)]
print(x)
print(y)

plt.bar(x, y, width=0.5, color="red")
plt.xlabel("$k$")
plt.ylabel("$p_k$")
plt.xlim([0,4])
[0, 1, 2, 3]
[0.0, 0.25, 0.5, 0.25]





(0.0, 4.0)

在这里插入图片描述

4.2、无向加权网络

# 创建加权网络
WG = nx.Graph()
WG.add_weighted_edges_from([(0, 1, 3.0), (1, 2, 7.5), (0, 2, 1.5)])

# 获取网络G的度
wd = dict(nx.degree(WG, weight='weight'))
print(wd)
# 获取网络WG的平均加权度
print("平均加权度为:", sum(wd.values())/len(G.nodes))
{0: 4.5, 1: 10.5, 2: 9.0}
平均加权度为: 6.0

4.3、有向网络

DG = nx.DiGraph()
# 添加节点
DG.add_nodes_from([1,2,3,4])
# 添加边
DG.add_edges_from([(1,2),(1,3),(2,3),(3,4),(4,3)])
nx.draw(DG, node_size=500, with_labels=True)

print("所有节点的入度为:", dict(DG.in_degree()))
print("所有节点的出度为:", dict(DG.out_degree()))
所有节点的入度为: {1: 0, 2: 1, 3: 3, 4: 1}
所有节点的出度为: {1: 2, 2: 1, 3: 1, 4: 1}

在这里插入图片描述

### 分别绘制入度和出度分布
di = dict(DG.in_degree())
print(di)
xi = list(range(max(di.values())+1))
yi = np.bincount(list(di.values()))
print(xi)
print(yi)

# 绘制入度频数分布直方图
plt.bar(xi, yi, width=0.5, color="red")
plt.xlabel("$k_{in}$")
plt.ylabel("$p(k_{in})$")
plt.xlim([-1,4])

# 出度分布与之类似
{1: 0, 2: 1, 3: 3, 4: 1}
[0, 1, 2, 3]
[1 2 0 1]





(-1.0, 4.0)

在这里插入图片描述

5.路径、距离、直径、效率和平均距离

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

import networkx as nx
import numpy as np

5.1、无向无权网络

# 创建空图
G = nx.Graph()
# 添加节点
G.add_nodes_from([1,2,3,4,5])
# 添加边
G.add_edges_from([(1,2),(2,3),(2,5),(3,4),(4,5)])
# 节点间的最短路径以及其长度
i, j = 1, 3
print(nx.shortest_path(G, i, j))
dij = nx.shortest_path_length(G, i, j)
dij
[1, 2, 3]





2
# 遍历所有节点间的最短路径长度
nodes = list(G.nodes())
for u in range(len(nodes)-1):
    for v in range(u+1, len(nodes)):
        i, j = nodes[u], nodes[v]
        if nx.has_path(G, i, j):
            dij = nx.shortest_path_length(G, i, j)
            print("节点{}和{}之间的最短路径长度为{}".format(i, j, dij))
        else:
            print("节点{}和{}之间没有路径!".format(i, j))
节点1和2之间的最短路径长度为1
节点1和3之间的最短路径长度为2
节点1和4之间的最短路径长度为3
节点1和5之间的最短路径长度为2
节点2和3之间的最短路径长度为1
节点2和4之间的最短路径长度为2
节点2和5之间的最短路径长度为1
节点3和4之间的最短路径长度为1
节点3和5之间的最短路径长度为2
节点4和5之间的最短路径长度为1
# 直径:G是连通网络才可调用以下函数
print(nx.diameter(G))

# 平均最短路径长度
print(nx.average_shortest_path_length(G))
3
1.6

5.2、无向加权网络

# 创建加权网络
WG = nx.Graph()
WG.add_weighted_edges_from([(1,2,3.0),(2,3,1.5),
(2,5,2.5),(3,4,2.0),(4,5,4.0)])

# 加权网络节点间的最短路径长度
i, j = 1, 3
dij = nx.shortest_path_length(WG, i, j, weight='weight')
dij
4.5

在这里插入图片描述

Ga = nx.Graph()
Ga.add_nodes_from([1,2,3,4,5,6,7])
Ga.add_edges_from([(1,2),(1,3),(2,3),(4,7),(5,6),(5,7),(6,7)])
nx.draw(Ga, node_size=500, with_labels=True)

在这里插入图片描述

Gb = nx.Graph()
Gb.add_nodes_from([1,2,3,4,5,6,7])
Gb.add_edges_from([(1,2),(1,3),(2,3),(2,4),(4,7),(5,6),(5,7),(6,7)])
nx.draw(Gb, node_size=500, with_labels=True)

在这里插入图片描述

print(nx.is_connected(Ga))
print(nx.is_connected(Gb))
False
True

6.网络的局部集聚系数、平均集聚系数以及全局集聚系数

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

创建一个简单无向无权图来展开演示

G = nx.Graph()
G.add_nodes_from([1,2,3,4,5,6,7])
G.add_edges_from([(1,2),(2,3),(2,4),(2,5),(4,5),(4,6),(4,7),(5,7)])
nx.draw(G, node_size=500, with_labels=True)

在这里插入图片描述

# 节点的局部集聚系数
# 返回字典格式,键为节点标签,值为对应的节点局部集聚系数
print(nx.clustering(G))
{1: 0, 2: 0.16666666666666666, 3: 0, 4: 0.3333333333333333, 5: 0.6666666666666666, 6: 0, 7: 1.0}
# 平均集聚系数
print(nx.average_clustering(G))
0.3095238095238095
# 全局集聚系数
print(nx.transitivity(G))
0.375
# # 若图G为加权图,可增加权重参数来求解局部集聚系数和平均集聚系数
# nx.clustering(G, weight='weight')
# nx.average_clustering(G, weight='weight')

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

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

相关文章

《Linux运维实战:MongoDB数据库逻辑备份恢复(方案四)》

一、备份与恢复方案 Percona Server for MongoDB Percona Server for MongoDB是一个免费的、增强的、完全兼容的、源代码可用的、带有企业级功能的MongoDB Community Edition的替代品。它不需要对MongoDB应用程序或代码进行更改。 参考官方&#xff1a;Percona Backup for Mon…

【漏洞复现】Docker runC 容器逃逸漏洞(CVE-2019-5736)

文章目录声明一、漏洞描述二、漏洞原理三、漏洞分析四、POC分析五、利用方式六、影响版本七、环境搭建八、漏洞复现九、修复建议声明 本篇文章仅用于技术研究和漏洞复现&#xff0c;切勿将文中涉及攻击手法用于非授权下渗透攻击行为&#xff0c;操作有风险&#xff0c;出现任何…

初识mysql

文章目录为什么要学习数据库什么是数据库数据库的分类MySQL简介连接数据库为什么要学习数据库 ①岗位需求 ②现在的世界&#xff0c;大数据时代&#xff0c;得数据者得天下 ③被迫需求&#xff1a;存数据 ④数据库是所有软件体系中最核心的存在 什么是数据库 数据库&…

java设计模式(2):UML图

统一建模语言&#xff08;Unified Modeling Language&#xff0c;UML&#xff09;是用来设计软件的可视化建模语言。它的特点是简单、统一、图形化、能表达软件设计中的动态与静态信息。 UML 从目标系统的不同角度出发&#xff0c;定义了用例图、类图、对象图、状态图、活动图…

kerberos环境下Flink on Yarn集群部署 基于flink1.15.3 hadoop 3.0CDH6.3.2

1.1 概要介绍 Flink on Yarn的HA高可用模式&#xff0c;首先依赖于Yarn自身的高可用机制&#xff08;ResourceManager高可用&#xff09;&#xff0c;并通过Yarn对JobManager进行管理&#xff0c;当JobManager失效时&#xff0c;Yarn将重新启动JobManager。其次Flink Job在恢复…

微服务框架 SpringCloud微服务架构 29 ES 集群 29.2 搭建集群

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构29 ES 集群29.2 搭建集群29.2.1 搭建ES 集群29 ES 集群 29.2 搭建集群 2…

kubernets 实践

文章目录kubernets 部署v1.25.5flink on k8sflink version 1.14.6kubernets 部署 v1.25.5 这里我选择的是kubeadm方式部署 虚拟机数量&#xff1a;4 centos发行版本&#xff1a;CentOS Linux release 7.9.2009 (Core) 内核版本&#xff1a;Linux hadoop101 5.4.225-1.el7.el…

简单又好用的5款小工具软件

人类与99%的动物之间最大差别在于是否会运用工具&#xff0c;借助好的工具&#xff0c;能提升几倍的工作效率。 1.软件卸载删除——UninstallTools UninstallTool 是一个小巧、安全、快速、强大的软件卸载删除工具&#xff0c;它支持在使用软件本身的卸载程序卸载完毕后&…

CMake中set_target_properties/get_target_property的使用

CMake中的set_target_properties命令用于为targets设置属性(targets can have properties that affect how they are built)&#xff0c;其格式如下&#xff1a; set_target_properties(target1 target2 ...PROPERTIES prop1 value1prop2 value2 ...) 该命令的语法是列出要更改…

浅析安科瑞无线测温装置在香港科技大学配电系统中的设计应用

摘要&#xff1a; 随着变电站自动化技术的推广和应用&#xff0c;无人值班的变电站越来越多&#xff0c;变电站的高压开关柜采用全密封结构&#xff0c;在长期运行过程中&#xff0c;开关的触点和母线连接等部位因老化或接触电阻过大而发热&#xff0c;由于这些发热部位的温度…

四种基于MQ的分布式事务解决方案

在微服务的时代&#xff0c;分布式事务是绕不开的话题&#xff0c;尽管在大多数场景下&#xff0c;我们并不需要使用分布式事务&#xff0c;但是 不需要使用 不代表 可以不会使用&#xff0c;万一哪天真需要用到了呢&#xff1f;分布式事务是一个比较大的话题&#xff0c;今天我…

1426827-79-3,endo-BCN-NHS ester,endo-BCN-NHS 活性酯

endo-BCN-NHS ester试剂反应原理&#xff1a; BCN基团与叠氮化物标记的生物分子反应&#xff0c;NHS酯可用于标记蛋白质的伯胺&#xff08;-NH2&#xff09;、胺修饰的寡核苷酸和其他含胺分子&#xff0c;西安凯新生物科技有限公司下面为大家整理分享。​endo-BCN-NHS ester物理…

Python学习基础笔记三十二——正则表达式

官方定义&#xff1a;正则表达式是对字符串操作的一种逻辑公式&#xff0c;就是用事先定义好的一些特殊字符、及这些特定字符的组合&#xff0c;组成一个“规则字符串”&#xff0c;这个规则字符串用来表达对字符串的一种过滤逻辑。 1、在Linux运维中&#xff0c;vi、grep、awk…

fiddler使用的作用与常见应用场景

Fiddler工具的工作原理 1.本地应用与服务器之间所有的Request 和Response都将经过Fiddler&#xff0c;由Fiddler进行转发&#xff0c;此时Fiddler以代理服务器的方式存在。 2.由于所有的网络数据都会经过Fiddler&#xff0c;因此Fiddler能够截获这些数据&#xff0c;实现网络…

美团四面 Java 岗,终获 offer,我是这么回答面试官的

前言 经历了 10 月的疫情挣扎与 11 月失业的煎熬&#xff0c;终于来到了春末的 12 月&#xff0c;内心的压力也稍稍的松懈了一些&#xff0c;终于可以放心找个工作了&#xff0c;可是随着的等待面试的机会的越来越少&#xff0c;这份焦虑反而越来越大&#xff0c;也偶尔会想&a…

稳定性建设之JavaScript代码不能被阻断

稳定性建设之JavaScript代码不能被阻断 背景 js代码可能会因为某些原因&#xff0c;导致出错&#xff0c;进而整个后续代码有可能都被阻断。直接影响线上的稳定性 最常见的js被阻断的情况 console.log(111) // 预期 a {} // 结果 a undefined a.a 1 console.log(222) // …

Pycharm的简单介绍以及api的使用

一、什么是Pycharm&#xff1f; Pycharm是一种python IDE&#xff0c;带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具&#xff0c;比如调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、脚本控制。此外&#xff0c;该IDE提供了一些高级功…

MyBatis-Plus中自动填充功能的用法

系列文章目录 Mybatis-PlusSpringBoot结合运用_心态还需努力呀的博客-CSDN博客MyBaits-Plus中TableField和TableId用法_心态还需努力呀的博客-CSDN博客 MyBatis-Plus之ActiveRecord[基础增删改查操作]_心态还需努力呀的博客-CSDN博客 MyBatis-Plus分页查询&#xff08;快速上…

【JavaWeb开发-Servlet】day06-学生成绩管理系统-实现分页功能

目录 一、前端设计 二、分页功能 ①创建实体层 ②在DAO层新建两个方法 ③编写业务层 ④实现Servlet层 ⑤修改前端页面 ⑥测试 ⑦思路 ⑧扩展 一、前端设计 原来的前端非常简陋&#xff0c;没有明显的突出其功能&#xff0c;下面将对前端页面进行新的完善。 写一个标题…

HPPH-DSPE-PEG/NH2/MAL光克洛-磷脂-聚乙二醇/光克洛-聚乙二醇-氨基/马来酰亚胺

小编今天和大家一起来学习HPPH-DSPE-PEG/NH2/MAL光克洛-磷脂-聚乙二醇/光克洛-聚乙二醇-氨基/马来酰亚胺相关研究内容! 光克洛&#xff0c;第二代的光敏剂&#xff0c;可用于光动力疗法 (PDT)&#xff0c;基本结构为二氢卟吩类化合物。美国研究人员从绿色植物中提取、纯化&…