graph-tool文档(一)- 快速开始使用Graph-tool - 1.创建和操纵图
目录:
快速开始使用graph-tool
- 创建和操纵图
-- 遍历顶点和边
----- 遍历所有顶点或边
----- 遍历一个顶点的neighbourhood
名词解释:
instante:实例
directed:有向;undirected:无向
on-the-fly:动态
property maps:属性映射
vertices and edges:顶点和边
descriptor:描述符
degree:度
index:索引
attribute:属性;property
invalidated:无效
iteration:迭代;iterators:迭代器
neighbours:邻接点
obtain:获取
graph_tool模块提供了一个图形类和一些操作它的算法。(graph_tool是一个模块,提供了类及其算法)
为了提高性能,这个类的内部以及大多数算法都是用c++编写的,使用了Boost Graph库。(Boost Graph Library,C++)
必须先导入模块,才能使用。包被细分成几个子模块。使用一个命令就可以将它们全部导入:(导入,子模块)
>>> from graph_tool.all import *
在下面,总是默认这一行是被运行的。
创建和操纵图
通过实例化一个Graph类来创建一个空图:(类的实例化)
>>> g = Graph()
默认情况下,新创建的图总是有向图。要想创建一个无向图,必须加入一个参数:(默认有向图)
>>> ug = Graph(directed=False)
可以使用set_directed()方法动态地将一个图在无向图和有向图之间切换(反之亦然)。
图的这种属性可以通过is_directed()查询:
>>> ug = Graph()
>>> ug.set_directed(False)
>>> assert(ug.is_directed() == False) #assert是什么意思?
也可以通过另一个图来创建一个新图,这时,整个图(它的内部属性映射,参见属性映射章节)将被复制:
>>> g1 = Graph()
>>> # ... construct g1 ...
>>> g2 = Graph(g1) # g1 and g2 are copies
以上,g2是g1的“深度”拷贝,即g2的任何修改不会影响到g1。
一旦创建了一个图,就可以向它填充顶点和边。
可以使用add_vertex()方法添加顶点,这将返回一个顶点类的实例,也被称为顶点描述符。(vertex类的实例,descriptor)
例如,下面的代码创建了两个顶点,并返回了存储在变量v1和v2中的顶点描述符。
>>> v1 = g.add_vertex()
>>> v2 = g.add_vertex()
可以通过类似的方式添加图的边,使用add_edge()方法,这将返回一个边的描述符(edge类的实例)。
>>> e = g.add_edge(v1, v2)
上面的代码创建了一个从v1到v2的有向边。
我们可以使用graph_draw()函数显示到目前为止我们创建的图。
>>> graph_draw(g, vertex_text=g.vertex_index, vertex_font_size=18,
... output_size=(200, 200), output="two-nodes.png")
<...>

图1:通过上面的命令创建的一个简单的有两个顶点和一条边的有向图
使用顶点和边的描述符,可以以任意的方式检查和操作图。
例如,为了获得一个顶点的出度,我们可以简单地调用out_degree()方法:
>>> print(v1.out_degree())
1
类似地,我们可以使用in_degree()方法查询入度。
注意:
对于无向图,“出度”是度的同义词,在这种情况下,一个顶点的入度总是零。
边的描述符有两个有用的方法:source()和 target(),它分别返回一条边的来源顶点和目标顶点。(source 和 target)
>>> print(e.source(), e.target())
0 1
add_vertex()方法还接受一个可选参数来指定要创建顶点的数量。(参数:数量)
如果该值大于1,则返回一个在添加顶点描述符上的迭代器:(返回,迭代器)
>>> vlist = g.add_vertex(10)
>>> print(len(list(vlist)))
10
图中的每个顶点有一个唯一的索引,它总是在0和N-1之间,N则是顶点的数量。(索引)
可以通过使用图的vertex_index属性来获取这个索引(这是一个属性映射,见属性映射一章),或将顶点描述符转换为int类型。(图的属性映射获得索引)
>>> v = g.add_vertex()
>>> print(g.vertex_index[v]) #注意是方括号
12
>>> print(int(v))
12
也可以随时使用remove_vertex()和remove_edge()方法将边和顶点删除:
>>> g.remove_edge(e) # e no longer exists
>>> g.remove_vertex(v2) # the second vertex is also gone
注意:
删除一个顶点通常是一个数学处理错误操作。
顶点都存储在一个STL向量内部,所以删除列表中间的一个元素需要改变列表的其余部分。
因此,快速删除(数学处理错误)仅是可能是:保证只删除列表的最后顶点(最后添加的顶点),或者相对顶点顺序是无效的。
最后一个行为可以通过remove_vertex() 的 fast == True 选项实现,导致被删除的顶点与最后一个顶点“交换”(即最大索引),这将反过来继承被删除了的顶点的索引。
警告:
由于以上原因,删除索引小于(n-1)的顶点将会使最后的(fast = True)或所有的(fast = True)指向较高索引顶点的描述符失效。
因此,如果在指定时间要删除超过一个顶点,他们应该被以索引降序的方式删除:
# 'del_list' is a list of vertex descriptors
for v in reversed(sorted(del_list)):
g.remove_vertex(v)
或者(最好),列表(或任何迭代器)直接作为顶点参数传递给remove_vertex()函数,上述过程在C++内部执行。
注意,属性映射值(参见属性映射)不受顶点删除后索引变化的影响。
注意:
删除一条边是一个(O(k{s} + k{t}))的操作,(k{s})是源顶点的出度,和(k{t})是目标顶点的入度。
可以通过设置set_fast_edge_removal()为真,更快地实现这个,在这种情况下,它变成(O(1)),以牺牲(O(E))空间大小。
边的描述符不会在边被删除之后失效。
既然顶点是索引的唯一标识,那就没有必要保持顶点标识符 lying around to access them at a later point.
如果我们知道了它的索引,我们就可以获取顶点的标识符,通过一个给定的索引,使用vertex()方法。
>>> v = g.vertex(8)
这需要一个索引,并返回一个顶点描述符。
边不能直接得到其索引,但如果一条边的源和目标顶点指定了,那就可以通过使用edge()方法获得它。
>>> g.add_edge(g.vertex(2), g.vertex(3))
<...>
>>> e = g.edge(2, 3)
获得边或顶点描述符的另一种方法是通过迭代,见迭代部分。
这实际上是获取顶点和边的描述符最有效的方式。
和顶点一样,边也有唯一的索引,这是由edge_index属性指定的:
>>> e = g.add_edge(g.vertex(0), g.vertex(1))
>>> print(g.edge_index[e])
1
不同于顶点,边的索引不一定要符合任何特定的范围。
如果没有边被删除,边的索引范围将在([0,E-1]),(E)是边的数量,早添加的边将有更低的索引值。
然而,如果一个边被删除,其索引将“空缺”,其余的索引停留在未修改的状态,因此不会处于([0,E-1])的范围内。
如果一个新的边被添加,它将重用旧的索引,以升序的方式。
遍历顶点和边
算法必须经常遍历顶点、边、顶点的出度等。
图和顶点类提供了不同类型的迭代器来实现这些。
迭代器总是指向边或顶点描述符。
遍历所有顶点和边
我们应该使用vertices()和edges()方法来遍历图所有的顶点或边:
for v in g.vertices():
print(v)
for e in g.edges():
print(e)
上面的代码将依序打印图的顶点和边。
遍历领接点
顶点的出、入边,出、如邻接点可以分别通过out_edges()、in_edges()、out_neighbours()和** in_neighbours()**方法来迭代。
from itertools import izip
for v in g.vertices():
for e in v.out_edges():
print(e)
for w in v.out_neighbours():
print(w)
# the edge and neighbours order always match
for e,w in izip(v.out_edges(), v.out_neighbours()):
assert(e.target() == w)
上面的代码将打印图中所有顶点的出边和出邻接点。
注意:
迭代器访问顶点和边的顺序总是与其被添加到图中的顺序一致(除了edges()返回的迭代器)。
通常,算法不关心这个次序,但是如果需要,可以使用这个固有的顺序。
警告:
任何情况下,在迭代时,你都不应该删除顶点或边的描述符,因为这会使迭代器失效(同C++)。
如果你打算在迭代期间删除顶点或边,您必须首先将它们存储某个地方(如列表),然后在不使用迭代器的时候删除它们。
在迭代期间删除会导致异常。
原文链接:Quick start using graph-tool
graph-tool文档(一)- 快速开始使用Graph-tool - 1.创建和操纵图的更多相关文章
- [Swift通天遁地]七、数据与安全-(2)对XML和HTML文档的快速解析
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- 空间日志编辑器:word文档图文快速粘贴到web
百度ueditor可以实现word文档图文快速粘贴到web 1.4.2之后官方并没有做功能的改动,1.4.2在word复制这块没有bug,其他版本会出现手动无法转存的情况 本文使用的后台是Java.前 ...
- apidoc接口文档的快速生成
官方文档连接:http://apidocjs.com/#demo apidoc是一个轻量级的在线REST接口文档生成系统,支持多种主流语言,包括Java.C.C#.PHP和Javascript等.使用 ...
- 淘宝(阿里百川)手机客户端开发日记第十篇 阿里百川服务器环境介绍之API文档的快速链接(四)
个人感觉比较重要的快速链接: http://open.taobao.com/doc/detail.htm?id=102513 http://open.taobao.com/doc/detail.htm ...
- 转: seajs手册与文档之 -- 快速参考 ( ~~useful )
目录 快速参考 seajs.use seajs.config define require require.async exports module.exports 快速参考 该页面列举了 SeaJS ...
- 快速创建vuepress项目(使用vuepress写文档)
vuepress的官方文档:https://vuepress.vuejs.org/zh/guide/ 参考:https://segmentfault.com/a/1190000016333850 ht ...
- 如何在ASP.NET Core 中快速构建PDF文档
比如我们需要ASP.NET Core 中需要通过PDF来进行某些简单的报表开发,随着这并不难,但还是会手忙脚乱的去搜索一些资料,那么恭喜您,这篇帖子会帮助到您,我们就不会再去浪费一些宝贵的时间. 在本 ...
- .Net魔法堂:提取注释生成API文档
一.前言 在多人协作的项目中,除了良好的代码规范外,完整的API文档也相当重要.通过文档我们快速了解系统各模块的实际接口,及其使用场景.使用示例,一定程度上降低沟通成本,和减少后期维护中知识遗失等风险 ...
- 产品需求文档(PRD)的写作方法之笔记一
1.写前准备(思维导图): http://www.woshipm.com/?p=80070 1.在写之前,请先很区分清楚什么是MRD文档(市场需求文档),BRD文档(商业需求文档),什么是PRD文档( ...
随机推荐
- 01scala环境搭建和基础
1.环境搭建 1.下载安装jdk1.7以上版本,并进行环境变量的配置 2.下载scala-2.10.4.msi,安装后进行环境变量的配置 3.下载scala-SDK-4.1.1-vfinal-2.11 ...
- C#String详解
字符串:stringLength - 字符串的长度. TrimStart() 压缩空格即消除字符串开始空格TrimEnd() 消除结尾空格Trim() 同时消除开头和结尾空格.注:中间空格不消除,因为 ...
- 6.Type and Member Basics
1.The Different Kinds of Type Members 1.Constants:a symbol that identifies a never-changing data val ...
- [Effective Java]第二章 创建和销毁对象
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- win 8 pip install 或者 pycharm 安装 paramiko 报错
这是安装时报错的最后几行 creating build\temp.win-amd64-3.5\Release\build creating build\temp.win-amd64-3.5\Relea ...
- 问题: unrecognized selector sent to class 0x10affab20
今天遇到了一个问题, 害我足足找了半个小时 问题: 明明可以跳进 方法 的实现里面, 但是程序运行的时候, 就是报错: 发送一个未识别消息, 而且程序直接跳出, 停止执行 原因: 项目的编译文件列表里 ...
- select into from 和 insert into select 的区别和用法及 SQL SELECT INTO 中Undeclared variable错误解决办法
今天试了一下数据表中的数据备份到另一个空的数据表,然后使用了SQL SELECT INTO语句,然后提示Undeclared variable......错误,现在在这里做下总结并给出解决办法. 应用 ...
- ie8不支持transform: translateY,ie9支持不友好
transform: translateY(0); ie8 不支持这个属性 但是我觉得用css实现的效果特好 特自然 也许是我的脚本写的不够完善 呵呵 现在我希望其他 主流的浏览器应用CSS ...
- SAP MM Consignment 寄售库存
转自:http://blog.csdn.net/futurewind/article/details/3985200 寄售,定义就是供应商的货物放在自己的库存中,使用的时候可以转到自己的库存,不用了就 ...
- [转载] 【每周推荐阅读】C-Store:列式存储数据库
Record-based与column-based是数据库和存储系统里面两种不同的data layout.我们的思维逻辑是基于行记录的,即Record-based data layout,数据记录都是 ...