networkx详细教程
写在前面:城市计算研究中经常涉及到图论
的相关知识,而且常常面对某些术语时,根本不知道在说什么.最近接触了NetworkX这个graph处理工具,发现这个工具已经解决绝大部分的图论
问题(也许只是我自己认为的,没有证据证明),所以把这个工具的使用学习下,顺便学习图论
的相关知识.
创建一个图
- import networkx as nx
- G = nx.Graph()
节点
- 一次添加一个节点
- G.add_node(1)
- 添加一个节点列表
- G.add_nodes_from([2, 3])
边
- 可以通过一次添加一条边来增长
- G.add_edge(1, 2)
- e = (2, 3)
- G.add_edge(*e) # unpack edge tuple*
- 也可以通过添加边列表
- G.add_edges_from([(1, 2), (1, 3)])
删除图中所有节点和边
- G.clear()
我们添加新的节点/边,并且NetworkX会自动的忽略任何已经存在的节点。
- G.add_edges_from([(1, 2), (1, 3)])
- G.add_node(1)
- G.add_edge(1, 2)
- G.add_node("spam") # adds node "spam"
- G.add_nodes_from("spam") # adds 4 nodes: 's', 'p', 'a', 'm'
- G.add_edge(3, 'm')
在这个阶段,图形G
由8个节点和3个边组成,如下所示:
- >>> G.number_of_nodes()
- 8
- >>> G.number_of_edges()
- 3
我们可以检查节点和边。四个基本图形属性:G.nodes
,G.edges
,G.adj
和G.degree
。这些是节点,边,邻居(邻接点)和图中节点的程度集的视图。
- >>> list(G.nodes)
- ['a', 1, 2, 3, 'spam', 'm', 'p', 's']
- >>> list(G.edges)
- [(1, 2), (1, 3), (3, 'm')]
- >>> list(G.adj[1]) # or list(G.neighbors(1))
- [2, 3]
- >>> G.degree[1] # the number of edges incident to 1
- 2
可以以类似于添加的方式从图中移除节点和边。使用方法 Graph.remove_node()
,Graph.remove_nodes_from()
, Graph.remove_edge()
和 Graph.remove_edges_from()
,如
- >>> G.remove_node(2)
- >>> G.remove_nodes_from("spam")
- >>> list(G.nodes)
- [1, 3, 'spam']
- >>> G.remove_edge(1, 3)
通过实例化其中一个图形类来创建图形结构时,可以使用多种格式指定数据
- >>> G.add_edge(1, 2)
- >>> H = nx.DiGraph(G) # create a DiGraph using the connections from G
- >>> list(H.edges())
- [(1, 2), (2, 1)]
- >>> edgelist = [(0, 1), (1, 2), (2, 3)]
- >>> H = nx.Graph(edgelist)
访问边和节点邻居
除了视图之外Graph.edges()
,Graph.adj()
还可以使用下标符号来访问边和邻居。
- >>> G[1] # same as G.adj[1]
- AtlasView({2: {}})
- >>> G[1][2]
- {}
- >>> G.edges[1, 2]
- {}
如果边已经存在,可以使用下标符号来获取/设置边的属性。
- >>> G.add_edge(1, 3)
- >>> G[1][3]['color'] = "blue"
- >>> G.edges[1, 2]['color'] = "red"
所有(节点,邻接节点)的快速查询都是使用 G.adjacency()
或G.adj.items()完成的
。请注意,对于无向图,邻接迭代会将每个边看两次。
- >>> FG = nx.Graph()
- >>> FG.add_weighted_edges_from([(1, 2, 0.125), (1, 3, 0.75), (2, 4, 1.2), (3, 4, 0.375)])
- >>> for n, nbrs in FG.adj.items():
- ... for nbr, eattr in nbrs.items():
- ... wt = eattr['weight']
- ... if wt < 0.5: print('(%d, %d, %.3f)' % (n, nbr, wt))
- (1, 2, 0.125)
- (2, 1, 0.125)
- (3, 4, 0.375)
- (4, 3, 0.375)
通过边属性可以方便地访问所有的边。
- >>> for (u, v, wt) in FG.edges.data('weight'):
- ... if wt < 0.5: print('(%d, %d, %.3f)' % (u, v, wt))
- (1, 2, 0.125)
- (3, 4, 0.375)
将属性添加到图形,节点和边
属性(如权重,标签,颜色或任何您喜欢的Python对象)可以附加到图形,节点或边上。
每个图形,节点和边都可以在关联的属性字典中保存键/值属性对(键必须是可散列的)。默认情况下,这些都是空的,但属性可以使用添加或更改add_edge
,add_node
或命名的属性字典的直接操作G.graph
,G.nodes
和 G.edges
一个图G。
图形属性
创建新图形时分配图形属性
- >>> G = nx.Graph(day="Friday")
- >>> G.graph
- {'day': 'Friday'}
或者也可以修改属性
- >>> G.graph['day'] = "Monday"
- >>> G.graph
- {'day': 'Monday'}
节点属性
添加节点属性使用add_node()
,add_nodes_from()
或G.nodes
- >>> G.add_node(1, time='5pm')
- >>> G.add_nodes_from([3], time='2pm')
- >>> G.nodes[1]
- {'time': '5pm'}
- >>> G.nodes[1]['room'] = 714
- >>> G.nodes.data()
- NodeDataView({1: {'room': 714, 'time': '5pm'}, 3: {'time': '2pm'}})
边属性
添加/更改边使用的属性add_edge()
,add_edges_from()
或标符号。
- >>> G.add_edge(1, 2, weight=4.7 )
- >>> G.add_edges_from([(3, 4), (4, 5)], color='red')
- >>> G.add_edges_from([(1, 2, {'color': 'blue'}), (2, 3, {'weight': 8})])
- >>> G[1][2]['weight'] = 4.7
- >>> G.edges[3, 4]['weight'] = 4.2
有向图:DiGraph()
DiGraph类提供特定于有向边的附加属性,例如DiGraph.out_edges()
,DiGraph.in_degree()
,DiGraph.predecessors()
,DiGraph.successors()
等。为了使算法能够轻松地处理这两个类, neighbor()
的功能等同于successors()
,而degree
会报告in_degree
和out_degree
的总和,即使有时可能会感觉不一致
- dg = nx.DiGraph()
- nodes1 = [
- ('Variable', {'name': 'avariable', 'table': 'tablename'}),
- ('Select', {'conditions': {'pro_code': 44}}),
- ('GroupBy', {'varname': 'gender'}),
- ('Mean', {}),
- ('Which1', {'level': 1}),
- ('Decimal1', {'place': 1}),
- ]
- nodes2 = [
- ('Which1', {'level': 2}),
- ('Decimal2', {'place': 1}),
- ]
- nodes3 = [
- ('Add', {})
- ]
- dg.add_nodes_from(nodes1)
- dg.add_nodes_from(nodes2)
- dg.add_nodes_from(nodes3)
- dg.add_edges_from([
- ('Variable', 'Select'),
- ('Select', 'GroupBy'),
- ('GroupBy', 'Mean'),
- ('Mean', 'Which1'),
- ('Mean', 'Which2'),
- ('Which1', 'Decimal1'),
- ('Which2', 'Decimal2'),
- ('Decimal1', 'Add'),
- ('Decimal2', 'Add'),
- ])
- nx.draw(dg, with_labels=True)
networkx详细教程的更多相关文章
- SASS教程sass超详细教程
SASS安装及使用(sass教程.详细教程) 采用SASS开发CSS,可以提高开发效率. SASS建立在Ruby的基础之上,所以得先安装Ruby. Ruby的安装: 安装 rubyinstaller- ...
- Git使用详细教程(一)
很久不发博客,最近有兴趣想写点东西,但 Live Writer 不支持从Word复制图片,疯狂吐槽下 Git使用详细教程(一) Git使用详细教程(二) 该教程主要是Git与IntelliJ IDEA ...
- Win7 U盘安装Ubuntu16.04 双系统详细教程
Win7 U盘安装Ubuntu16.04 双系统详细教程 安装主要分为以下几步: 一. 下载Ubuntu 16.04镜像软件: 二. 制作U盘启动盘使用ultraISO: 三. 安装Ubuntu系统: ...
- Windows7 64位系统搭建Cocos2d-x-2.2.1最新版以及Android交叉编译环境(详细教程)
Windows7 64位系统搭建Cocos2d-x-2.2.1最新版以及Android交叉编译环境(详细教程) 声明:本教程在参考了以下博文,并经过自己的摸索后实际操作得出,本教程系本人原创,由于升级 ...
- Ubuntu 16.04安装QQ国际版图文详细教程
因工作需要,我安装了Ubuntu 16.04,但是工作上的很多事情需要QQ联系,然而在Ubuntu上的WebQQ很是不好用,于是在网上搜索了好多个Linux版本的QQ,然而不是功能不全 ...
- Ubuntu-安装-theano+caffe-超详细教程
一.说明 本文是继<Ubuntu-安装-cuda7.0-单显卡-超详细教程> 之后的续篇.theano和caffe是深度学习库,对运算能力需求很大,最好使用cuda进行加速.所以,请先阅读 ...
- Struts2详细教程
Struts2详细教程:http://www.yiibai.com/struts_2/
- Java log4j详细教程
Java log4j详细教程 http://www.jb51.net/article/74475.htm
- [分享] 从定制Win7母盘到封装详细教程 By BILL ( 10月23日补充说明 )
[分享] 从定制Win7母盘到封装详细教程 By BILL ( 10月23日补充说明 ) billcheung 发表于 2011-10-23 00:07:49 https://www.itsk.com ...
随机推荐
- 鼠标经过盒子出现边框(伪元素,定位,css3盒子模型)
<body> <div> <img src="mi6.png" > </div> </body> div{ width: ...
- CSS精灵图(王者荣耀案例)
首先,我们应该知道引入精灵图的原因: 具体是因为,网页上面的每张图片都要经历一次请求才能展示给用户,小的图标频繁的请求服务器,降低页面的加载速度,为了有效地减少服务器接收和发送请求的次数,提高页面的加 ...
- 洛谷P2456 二进制方程
题目 字符串模拟+并查集 建立两个并查集分别存放每个变量的每一位数的祖先,一个是1一个是2 考虑每个字母的每一位的数都是唯一的,先模拟,记录每一个变量的每一位. 一一映射到方程中去,最后将两个方程进行 ...
- SSM 整合 ehcache spring 配置文件报错
添加 <!-- end MyBatis使用ehcache缓存 --> <cache:annotation-driven cache-manager="cacheManage ...
- nodejs express cheerio request爬虫
const express = require('express') const cheerio = require('cheerio') const request = require(" ...
- 实现本地des和aes 解密的工具
<?php $raw = file_get_contents('php://input'); if(!empty($raw)) { parse_str($raw);//解析到当前作用域 if ( ...
- nodejs搜索包的流程
执行npm install后,如果打包成功,会在当前目录下生成一个node_modules的文件夹,里面存放着我们所需的依赖包. 当需要引用时,例如: var math = require(" ...
- List和Array相互转换
List<String> list = new ArrayList<String>(); list.add("1"); list.add("2&q ...
- SonarQube Detection of Injection Flaws in Java, C#, PHP
Code Quality Tools Review: Sonar, PMD, Findbugs and Checkstyle Sonar CheckStyle, FindBugs and PMD - ...
- centos下如何开放某个端口?
命令如下: firewall-cmd --permanent --add-port=/tcp (开放22端口) firewall-cmd --reload