图的类型

Graph类是无向图的基类,无向图能有自己的属性或参数,不包含重边,允许有回路,节点可以是任何hash的python对象,节点和边可以保存key/value属性对。
该类的构造函数为Graph(data=None,**attr),其中data可以是边列表,或任意一个Networkx的图对象,默认为none;attr是关键字参数,例如key=value对形式的属性。

MultiGraph是可以有重边的无向图,其它和Graph类似。
其构造函数MultiGraph(data=None, *attr)

DiGraph是有向图的基类,有向图可以有数自己的属性或参数,不包含重边,允许有回路;节点可以是任何hash的python对象,边和节点可含key/value属性对。
该类的构造函数DiGraph(data=None,**attr),其中data可以是边列表,或任意一个Networkx的图对象,默认为none;attr是关键字参数,例如key=value对形式的属性

MultiDiGraph是可以有重边的有向图,其它和DiGraph类似。
其构造函数MultiDiGraph(data=None, *attr)

图的创建

import networkx as nxG=nx.Graph() #创建了一个没有节点和边的空图G.add_node(1)#一次增加一个节点:G.add_nodes_from([2,3])#可以是列表、字典、文件的某些行、其它图等G.add_nodes_from(H) #H is a graph object here

图的边

#一次增加一条边:
G.add_edge(1,2)
#列表
G.add_edges_from([(1,2),(1,3)])
# 边集合
G.add_edges_from(H.edges())

属性

对于图,边和节点都能将key/value对作为自己的属性,保存在相关的dictionary中。该关联字典默认为空,但是能通过add_edge,add_node或操作进行修改。
添加图的属性:

   G=nx.Graph(day="Friday")

添加节点的属性:#主要的方法是add_node()和add_nodes_from()

G.add_node(1,time=‘5pm‘)  #给节点1加属性对time:5pm
G.add_nodes_from([3], time=‘2pm‘) #对前一个参数中的所有节点,添加属性对time:2pm
G.node[1][‘room‘]=714  #为G中的节点1添加属性对room:714

添加边的属性:#主要方法是add_edge(),add_edges()和G.edge

 G.add_edge(1,2,‘weight‘=4.7) #为1和2之间的边,添加属性weight:4.7
G.add_edges_from([(3,4),(4,5)],color=‘red‘) #为连接3和4、4和5的边添加属性对color:red
G[1][2][‘weight‘]=4.7
G.edge[1][2][‘weight‘]=4

其它

len(G)  #返回G中节点数目n in G  #检查节点n是否在G中,如在,返回true。

相关函数

初始化:G=nx.Graph()

图相关属性的函数:

nx.degree(G)// 计算图的密度,其值为边数m除以图中可能边数(即n(n-1)/2)

nx.degree_centrality(G)//节点度中心系数。通过节点的度表示节点在图中的重要性,默认情况下会进行归一化,其值表达为节点度d(u)除以n-1(其中n-1就是归一化使用的常量)。这里由于可能存在循环,所以该值可能大于1.

nx.closeness_centrality(G)//节点距离中心系数。通过距离来表示节点在图中的重要性,一般是指节点到其他节点的平均路径的倒数,这里还乘以了n-1。该值越大表示节点到其他节点的距离越近,即中心性越高。

nx.betweenness_centrality(G)//节点介数中心系数。在无向图中,该值表示为节点作占最短路径的个数除以((n-1)(n-2)/2);在有向图中,该值表达为节点作占最短路径个数除以((n-1)(n-2))。

nx.transitivity(G)//图或网络的传递性。即图或网络中,认识同一个节点的两个节点也可能认识双方,计算公式为3*图中三角形的个数/三元组个数(该三元组个数是有公共顶点的边对数,这样就好数了)。

nx.clustering(G)//图或网络中节点的聚类系数。计算公式为:节点u的两个邻居节点间的边数除以((d(u)(d(u)-1)/2)。

实例:

  • 无向图:
import networkx as nx                            #导入NetworkX包,为了少打几个字母,将其重命名为nx
G = nx.Graph()                                        #建立一个空的无向图G
G.add_node(1)                                        #添加一个节点1
G.add_edge(2,3)                                     #添加一条边2-3(隐含着添加了两个节点2、3)
G.add_edge(3,2)                                     #对于无向图,边3-2与边2-3被认为是一条边
print G.nodes()                                       #输出全部的节点: [1, 2, 3]
print G.edges()                                       #输出全部的边:[(2, 3)]
print G.number_of_edges()                    #输出边的数量:1
  • 有向图
    有向图的建立方式和无向图基本类似,只是在上述代码的第二行,将G = nx.Graph() 改为 G = nx.DiGraph() 。需要注意的是,此时再添加边3-2与边2-3,则被认为是两条不同的边(可以试着运行上述代码,自己查看结果)。
    同时,有向图和无向图是可以相互转化的,分别用到Graph.to_undirected() 和 Graph.to_directed()两个方法。

  • 加权图(网络)
    有向图和无向图都可以给边赋予权重,用到的方法是add_weighted_edges_from,它接受1个或多个三元组[u,v,w]作为参数,其中u是起点,v是终点,w是权重。例如:

G.add_weighted_edges_from([(0,1,3.0),(1,2,7.5)])print G.get_edge_data(1,2)    #输出{‘weight‘: 7.5},这是一个字典结构,可以查看python语法了解它的用法。
  • 论文中的图
def build_graph(train_data):graph = nx.DiGraph()for seq in train_data:for i in range(len(seq) - 1):if graph.get_edge_data(seq[i], seq[i + 1]) is None:weight = 1else:weight = graph.get_edge_data(seq[i], seq[i + 1])['weight'] + 1graph.add_edge(seq[i], seq[i + 1], weight=weight)for node in graph.nodes:sum = 0for j, i in graph.in_edges(node):sum += graph.get_edge_data(j, i)['weight']if sum != 0:for j, i in graph.in_edges(i):graph.add_edge(j, i, weight=graph.get_edge_data(j, i)['weight'] / sum)return graph

调用图算法
NetworkX 提供了常用的图论经典算法,例如DFS、BFS、最短路、最小生成树、最大流等等,非常丰富,如果不做复杂网络,只作图论方面的工作,也可以应用 NetworkX作为基本的开发包。具体的算法调用方法我就不一一介绍了,

其他详见:

http://www.bubuko.com/infodetail-1718433.html

https://www.cnblogs.com/kaituorensheng/p/5423131.html

Python基础:networkx (图论与复杂网络建模工具)相关推荐

  1. python基础 Networkx

    Networkx 1.介绍 "用于复杂网络高生产力软件"的分析模块 可以表示各种网络(有向.无向.多图)的数据结构 极高的灵活性:节点可以是python中任意对象,边可以包含任意数 ...

  2. Python基础——PyCharm版本——第一章、PyCharm工具的安装与使用

  3. 【Python基础】利用 Python 搞定精美网络图!

    作者:叶庭云     编辑:Lemon      出品:Python数据之道 一.NetworkX 概述 NetworkX 是一个用 Python 语言开发的图论与复杂网络建模工具,内置了常用的图与复 ...

  4. Python 计算两个连通子图距离_复杂网络分析之python利器NetworkX

    点击蓝字 关注我们 1 networkx介绍 networkx在2002年5月产生,是一个用Python语言开发的图论与复杂网络建模工具,内置了常用的图与复杂网络分析算法,可以方便的进行复杂网络数据分 ...

  5. python画圆形螺旋线_【Python基础】利用 Python 搞定精美网络图!

    作者:叶庭云     编辑:Lemon      出品:Python数据之道 一.NetworkX 概述NetworkX 是一个用 Python 语言开发的图论与复杂网络建模工具,内置了常用的图与复杂 ...

  6. 【转】介绍几个图论和复杂网络的程序库 —— BGL,QuickGraph,igraph和NetworkX

    原文来自:http://blog.sciencenet.cn/blog-404069-297233.html 作复杂网络研究离不开对各种实际或模拟网络的统计.计算.绘图等工作.对于一般性的工作,我们可 ...

  7. python求两数之和的命令_数学建模:科学计算Python2小时-Python基础

    这一部分主要面向数模活动中的python基础知识进行讨论 作者 系列文章(科学计算Python2小时)目录:李似:科学计算Python2小时-前言与目录​zhuanlan.zhihu.com 首先要说 ...

  8. 【复杂网络建模】——Python可视化重要节点识别(PageRank算法)

    目录 一.复杂网络建模 二.建模的算法 三.使用PageRank算法进行网络重要节点识别 1.PageRank算法 2.基于PageRank算法的ER网络重要节点识别 3.基于PageRank算法的小 ...

  9. [Python从零到壹] 九.网络爬虫之Selenium基础技术万字详解(定位元素、常用方法、键盘鼠标操作)

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

最新文章

  1. Open3D点云处理算法最全合集
  2. 关于更新系统后CocoaPods不能使用的问题
  3. Hive关于数据库的增删改查
  4. pyqt5——控件1
  5. 使用Nginx的proxy_cache缓存功能取代Squid(转)
  6. 概率分布与马尔科夫链的关系讨论(上传费事)
  7. SaltStack之数据系统
  8. backgroundWorker控件使用笔记
  9. python实现word批量转pdf
  10. 你努力工作会让老板感动吗?
  11. 和平精英显示与服务器断开连接,和平精英网络异常怎么办 网络异常解决方法...
  12. 在xp中不能查看或更改文件夹的“只读”属性或“系统”属性解决方法
  13. 美团四年,字节三年这七年测试之路希望能让正在迷茫的你少走弯路
  14. 猿创征文|HCIE-Security Day60:邮件过滤技术
  15. word to sql
  16. 笨方法学python 习题9
  17. linux转化大小写,linux转换大小写
  18. 中级工程师专业有哪些?职称申报有哪些要求?伴德诚
  19. springboot和kafka结合其中enable.auto.commit等于false失效
  20. 【数据结构 - 树和二叉树】自学笔记记录(完结)

热门文章

  1. Android多媒体软件开发入门(一)
  2. VB的Autoredraw、refresh等等功能分析汇总及“内存作图”
  3. 英文和中文字体如何合并
  4. 【Mo 人工智能技术博客】胶囊网络——Capsule Network
  5. 中文标点符号占用几个字节_英文字符占几个字节?汉字字符、还有标点呢?????...
  6. html仿照聊天下拉刷新,h5实现下拉刷新,模拟原生下拉刷新,封装组件
  7. 同花顺快捷键以及使用方法
  8. ABAP学习(8):操作EXCEL
  9. 850pro测试软件,三星850Pro系列SSD介绍
  10. Excel中工作表很多时,如何给工作表做目录?