networkx是Python的一个包,用于构建和操作复杂的图结构,提供分析图的算法。图是由顶点、边和可选的属性构成的数据结构,顶点表示数据,边是由两个顶点唯一确定的,表示两个顶点之间的关系。顶点和边也可以拥有更多的属性,以存储更多的信息。

对于networkx创建的无向图,允许一条边的两个顶点是相同的,即允许出现自循环,但是不允许两个顶点之间存在多条边,即出现平行边。边和顶点都可以有自定义的属性,属性称作边和顶点的数据,每一个属性都是一个Key:Value对。

一,创建图

在创建图之前,需要导入networkx模块,通常设置别名为nx;如果创建的图中,顶点之间的边没有方向,那么该图称作无向图。在创建图时,可以通过help(g)来获得图的帮助文档。

import networkx as nx

g=nx.Graph()#创建空的无向图

g=nx.DiGraph()#创建空的有向图

二,图的顶点

图中的每一个顶点Node都有一个关键的ID属性,用于唯一标识一个节点,ID属性可以整数或字符类型;顶点除了ID属性之外,还可以自定义其他的属性。

1,向图中增加顶点

在向图中增加顶点时,可以一次增加一个顶点,也可以一次性增加多个顶点,顶点的ID属性是必需的。在添加顶点之后,可以通过g.nodes()函数获得图的所有顶点的视图,返回的实际上NodeView对象;如果为g.nodes(data=True)的data参数设置为true,那么返回的是NodeDataView对象,该对象不仅包含每个顶点的ID属性,还包括顶点的其他属性。

g.add_node(1)

g.add_nodes_from([2,3,4])

g.nodes()

#NodeView((1, 2,3,4))

在向图中添加顶点时,除ID属性之外,也可以向顶点中增加自定义的属性,例如,名称属性,权重属性:

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

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

2,查看顶点的属性

通过属性_node获得图的所有顶点和属性的信息,_node属性返回的是一个字典结构,字典的Key属性是顶点的ID属性,Value属性是顶点的其他属性构成的一个字典。

>>> 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函数删除图的顶点,由于顶点的ID属性能够唯一标识一个顶点,通常删除顶点都需要通过传递ID属性作为参数。

g.remove_node(node_ID)

g.remove_nodes_from(nodes_list)

4,更新顶点

更新图的顶点,有两种方式,第一种方式使用字典结构的_update函数,第二种方式是通过索引来设置新值:

>>> 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方式来判断,也可以使用函数:

g.has_node(n)

三,图的边

图的边用于表示两个顶点之间的关系,因此,边是由两个顶点唯一确定的。为了表示复杂的关系,通常会为边增加一个权重weight属性;为了表示关系的类型,也会设置为边设置一个关系属性。

1,向图中增加边

边是由对应顶点的名称构成的,例如,顶点2和3之间有一条边,记作e=(2,3),通过add_edge(node1,node2)向图中添加一条边,也可以通过add_edges_from(list)向图中添加多条边;在添加边时,如果顶点不存在,那么networkx会自动把相应的顶点加入到图中。

g.add_edge(2,3)

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

g.edges()

#EdgeView([(1, 2), (1, 3), (2, 3)])

可以向边中增加属性,例如,权重,关系等:

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

由于在图中,边的权重weight是非常有用和常用的属性,因此,networkx模块内置以一个函数,专门用于在添加边时设置边的权重,该函数的参数是三元组,前两个字段是顶点的ID属性,用于标识一个边,第三个字段是边的权重:

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

在增加边时,也可以一次增加多条边,为不同的边设置不同的属性:

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

2,查看边的属性

查看边的属性,就是查看边的数据(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属性构成的元组,通过 edge=(node1,node2) 来标识边,进而从图中找到边:

g.remove_edge(edge)

g.remove_edges_from(edges_list)

4,更新边的属性

通过边来更新边的属性,由两种方式,一种是使用update函数,一种是通过属性赋值来实现:

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)

四,图的属性

图的属性主要是指相邻数据,节点和边。

1,adj

ajd返回的是一个AdjacencyView视图,该视图是顶点的相邻的顶点和顶点的属性,用于显示用于存储与顶点相邻的顶点的数据,这是一个只读的字典结构,Key是顶点,Value是顶点的属性数据。

>>> 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.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或函数g.edges()来获得图的边视图。

EdgeDataView提供图的边和边的属性,可以通过EdgeView对象来调用data()函数获得。

3,nodes

图的顶点是顶点和顶点的属性构成的

>>> 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或函数g.nodes()来获得。

NodeDataView提供图的边和边的属性,可以通过NodeView对象来调用data()函数获得。

4,degree

对于无向图,顶点的度是指跟顶点相连的边的数量;对于有向图,顶点的图分为入度和出度,朝向顶点的边称作入度;背向顶点的边称作出度。

通过g.degree 或g.degree()能够获得DegreeView对象,

五,图的遍历

图的遍历是指按照图中各顶点之间的边,从图中的任一顶点出发,对图中的所有顶点访问一次且只访问一次。图的遍历按照优先顺序的不同,通常分为深度优先搜索(DFS)和广度优先搜索(BFS)两种方式。

1,查看顶点的相邻顶点

查看顶点的相邻顶点,有多种方式,例如,以下代码都用于返回顶点1的相邻顶点,g[n]表示图g中,与顶点n相邻的所有顶点:

g[n]

g.adj[n]

g.neighbors(n)

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

2,查看图的相邻

该函数返回顶点n和相邻的节点信息:

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

... print(n)

... print(nbrs)

3,图的遍历

深度优先遍历的算法:

首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的相邻顶点;

当当前顶点没有未访问过的相邻顶点时,则回到上一个顶点,继续试探别的相邻顶点,直到所有的顶点都被访问过。

深度优先遍历算法的思想是:从一个顶点出发,一条路走到底;如果此路走不通,就返回上一个顶点,继续走其他路。

广度优先遍历的算法:

从顶点v出发,依次访问v的各个未访问过的相邻顶点;

分别从这些相邻顶点出发依次访问它们的相邻顶点;

广度优先遍历算法的思想是:以v为起点,按照路径的长度,由近至远,依次访问和v有路径相通且路径长度为1,2...,n的顶点。

在进行图遍历时,需要访问顶点的相邻顶点,这需要用到adjacency()函数,例如,g是一个无向图,n是顶点,nbrs是顶点n的相邻顶点,是一个字典结构

for n,nbrs in g.adjacency():

print (n, nbrs)

for nbr,attr in nbrs.items():

# nbr表示跟n连接的顶点,attr表示这两个点连边的属性集合

print(nbr,attr)

六,绘制Graph

使用networkx模块draw()函数构造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()函数来计算,该函数根据顶点的入边和边的权重来计算顶点的PR值,也就是说,PR值跟顶点的入边有关,跟入边的weight(权重)属性有关:

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

常用参数注释:

g:无向图会被转换为有向图,一条无向边转换为两条有向边;

alpha:阻尼参数,默认值是0.85,取值范围为 0 到 1, 代表从图中某一特定点指向其他任意点的概率;

weight:默认值是weight,表示使用edge的weight属性作为权重,如果没有指定,那么把edge的权重设置为1;

1,举个例子

例如,创建一个有向图,由三个顶点(A、B和C),两条边(A指向B,A指向C),边的权重都是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}

修改边的权重,并查看顶点的PR值:

g['A']['C']['weight']=1

print( nx.pagerank(g))

# {'A': 0.259740259292235, 'C': 0.40692640737443164, 'B': 0.3333333333333333}

2,查看各个顶点的PR值

根据图来创建PageRank,并查看各个顶点的PageRank值

pr=nx.pagerank(g)

#page_rank_value=pr[node]

for node, pageRankValue in pr.items():

print("%s,%.4f" %(node,pageRankValue))

参考文档:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

python networkx_Python networkx包的实现相关推荐

  1. python networkx包,使用Python中NetworkX包绘制深度神经网络结构图

    Python批量自动裁剪图片 Python批量自动裁剪图片 1 用Pythonp批量裁剪图片 2 3 from PIL import Image 4 import matplotlib.pyplot ...

  2. 用python画关系网络图-python networkx 包绘制复杂网络关系图的实现

    1. 创建一个图 import networkx as nx g = nx.Graph() g.clear() #将图上元素清空 所有的构建复杂网络图的操作基本都围绕这个g来执行. 2. 节点 节点的 ...

  3. 用python画关系网络图-python networkx 包绘制复杂网络关系图

    目录 创建一个图 节点 边 查看图上点和边的信息 图的属性设置 点的属性设置 边的属性设置 不同类型的图(有向图Directed graphs , 重边图 Multigraphs) 图的遍历 图生成和 ...

  4. python绘制社会关系网络图_python networkx 包绘制复杂网络关系图的实现

    1. 创建一个图 import networkx as nx g = nx.Graph() g.clear() #将图上元素清空 所有的构建复杂网络图的操作基本都围绕这个g来执行. 2. 节点 节点的 ...

  5. python做马尔科夫模型预测法_通过Python的Networkx和Sklearn来介绍隐性马尔科夫模型...

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 文章梗概 马尔科夫是何人? 马尔科夫性质是什么? 马尔科夫模型是什么? 是什么让马尔科夫模型成为隐性的? ...

  6. python之networkx库小结

    python之networkx库小结(转) 本文转载自 https://blog.csdn.net/your_answer/article/details/79189660 一.安装 安装的话,跟其他 ...

  7. python导入外部包_您会喜欢的10个外部Python软件包

    python导入外部包 by Adam Goldschmidt 亚当·戈德施密特(Adam Goldschmidt) 您会喜欢的10个外部Python软件包 (10 External Python p ...

  8. Python的常用包有哪些,分别有什么作用?

    [每日一问] Python的常用包有哪些,分别有什么作用? 来自Datawhale优秀回答者:追风者 Python常用包 1.Numpy(数值运算库) 2.Scipy(科学计算库) 3.Matplot ...

  9. python模块和包用法详解(__all__)

    1. 模块         Python 模块(Module),是⼀个 Python ⽂件,以 .py 结尾,包含了 Python 对象定义和Python语句.         模块能定义函数,类和变 ...

最新文章

  1. Spring Boot + Vue 如此强大?竟然可以开发基于 C/S 架构的应用
  2. Cmder命令行工具在Windows系统中的配置
  3. 学习Git_12.10
  4. 【技术好文转载】未来技术前瞻
  5. mysql2阶段提交具体实现_ShardingSphere 4.x 分布式事务之实现原理
  6. 新版易支付源码支持即时到账功能
  7. python表达式3 5_python3 第五章 - 什么是变量、运算符、表达式
  8. linux救援模式使用、自制linux系统和linux内核编译
  9. mysql 数据库时间类型 datetime 数据在页面上显示一串数字, 用函数date_format( )转换格式 ;
  10. UVA 1611 Crane
  11. hadoop与mysql的区别_数据库与hadoop与分布式文件系统的区别和联系
  12. git最简单直接粗爆与github教程
  13. 高精度算法 万字详解(C++)
  14. Python标准库大全
  15. maven使用国内源和使用代理
  16. 用HTML来做导航栏
  17. CTF-安全杂项-BAT公司信息查询系统
  18. RRStudio(一)
  19. Java岗大厂面试百日冲刺【Day54】— Redis4 (日积月累,每日三题)
  20. WinHex工具制作编程器固件(4M-8M-16M)

热门文章

  1. Win7下的vs2008破解
  2. vue 实现鼠标写签名(电子签名)
  3. S2-MLP: Spatial-Shift MLP Architecture for Vision
  4. php车辆静电贴,怎样清除车窗玻璃上的贴纸 及汽车前挡标志静电贴使用方法
  5. 清华大学五道口金融学院全日制博士(普博)项目简介
  6. go语言web开发入门之Hello World
  7. go语言Web开发框架:项目开发介绍及实战项目介绍
  8. Linux下使用百度云盘
  9. 受得了多大的委屈,做得了多大的事;受得了多大诋毁,就能承的住多大赞美;耐得住寂寞,才能守得住繁华。
  10. PHP之 向下取整 保留2位小数