graph-tool 练习
2016-06-09 23:19
375 查看
如何使用graph-tool模块,如何导入?如何使用graph,使用其算法?
如何使用Boost Graph库,安装,测试?
如何精准的创建有向图和无向图?
如何切换有向和无向?
如何查询图的有向和无向属性?
如何通过一个已有的图创建新图?
如何添加顶点?
如何创建边?
如何浏览显示已有的图?
如何获得顶点的出度?
怎么返回一条边的source和target?
如何创建顶点,创建指定数量的顶点?
如何获得顶点的索引?
怎么将顶点和边删除?fast == True选项如何使用?set_fast_edge_removal()如何使用?
如何通过索引获得顶点?
如何通过索引获得边?
如何显示边的索引?
如何为图创建新的属性映射?
如何访问属性映射?
.
.
.
属性映射访问的其他形式?
怎么使用内部属性映射?
区分类型,名字和值!!!
如何通过属性访问属性映射?
图从文件保存和加载的方法,从磁盘加载的方法?
.
.
如何使用Boost Graph库,安装,测试?
1 创建和操纵图
如何创建空图?g = Graph()
如何精准的创建有向图和无向图?
ug = Graph(directed=False)
如何切换有向和无向?
ug.set_directed(False)
如何查询图的有向和无向属性?
assert(ug.is_directed() == False)
如何通过一个已有的图创建新图?
g1 = Graph()
g2 = Graph(g1)
如何添加顶点?
v1 = g.add_vertex()
v2 = g.add_vertex()
如何创建边?
e = g.add_edge(v1, v2)
如何浏览显示已有的图?
graph_draw(g, vertex_text=g.vertex_index, vertex_font_size=18,output_size=(200, 200), output="two-nodes.png")
如何获得顶点的出度?
print(v1.out_degree())
怎么返回一条边的source和target?
print(e.source(), e.target())
如何创建顶点,创建指定数量的顶点?
vlist = g.add_vertex(10)
print(len(list(vlist)))
如何获得顶点的索引?
v = g.add_vertex()
print(g.vertex_index[v])
print(int(v))
怎么将顶点和边删除?fast == True选项如何使用?set_fast_edge_removal()如何使用?
g.remove_edge(e)
g.remove_vertex(v2)
如何通过索引获得顶点?
v = g.vertex(8)
如何通过索引获得边?
g.add_edge(g.vertex(2), g.vertex(3))
e = g.edge(2, 3)
如何显示边的索引?
e = g.add_edge(g.vertex(0), g.vertex(1))
print(g.edge_index[e])
1.1 遍历顶点和边
1.1.1 遍历所有顶点或边
如何遍历图所有的顶点或边?vertices()
edges()
for v in g.vertices(): print(v) for e in g.edges(): print(e)
1.1.2 遍历一个顶点的neighbourhood
如何遍历顶点的出/入边以及出/入邻接点?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)
2 属性映射
什么是属性映射?有哪几种类型?由哪个类操作?属性映射的值得类型有哪几种?一种将额外信息与顶点、边或图本身相关联的方式。
顶点、边和图。
PropertyMap类
bool、int16_t、int32_t、int64_t、double、long double、string、vector bool
vector uint8_t、vector int16_t、vector int32_t、vector int64_t、vector double
vector long double、vector string、python::object
如何为图创建新的属性映射?
new_vertex_property()
new_edge_property()
new_graph_property()
如何访问属性映射?
通过顶点或边的描述符或图本身,来访问该值(属性映射描述符[顶点、边或图])
vprop_double = g.new_vertex_property("double")顶点的属性映射
vprop_double[g.vertex(10)] = 3.1416
.
vprop_vint = g.new_vertex_property("vector<int>")顶点的属性映射
vprop_vint[g.vertex(40)] = [1, 3, 42, 54]
.
eprop_dict = g.new_edge_property("object")边的属性映射
eprop_dict[g.edges().next()] = {"foo": "bar", "gnu": 42}
.
gprop_bool = g.new_graph_property("bool")图的属性映射
gprop_bool[g] = True
属性映射访问的其他形式?
vprop_double.get_array()[:] = random(g.num_vertices())get_array()方法
vprop_double.a = random(g.num_vertices())a属性
2.1 内部属性映射
什么是内部属性映射?被复制并和图一起被保存到一个文件,属性被内在化
怎么使用内部属性映射?
属性映射必须有一个唯一的名称,相当于一个类型,可以产生具体的实例,即具体的属性
vertex_propertiesvp
edge_propertiesep
graph_propertiesgp
区分类型,名字和值!!!
>>> gprop = g.new_graph_property("int") #定义了一个类型 >>> g.graph_properties["foo"] = gprop # 定义了一个变量 >>> g.graph_properties["foo"] = 42 # 为变量赋了一个值 >>> print(g.graph_properties["foo"]) #输出变量的值 42 >>> del g.graph_properties["foo"] # 删除了定义过的变量
如何通过属性访问属性映射?
>>> vprop = g.new_vertex_property("double") >>> g.vp.foo = vprop # 等价于g.vertex_properties["foo"] = vprop >>> v = g.vertex(0) >>> g.vp.foo[v] = 3.14 #等价于v.vertex_properties["foo"] = 3.14 >>> print(g.vp.foo[v]) 3.14
图的I/O
图保存和加载的四种格式?graphml、dot、gml和gt
图从文件保存和加载的方法,从磁盘加载的方法?
save()
load()
load_graph()
.
g = Graph() g.save("my_graph.xml.gz") g2 = load_graph("my_graph.xml.gz")
.
pickle模块
一个例子:构建一个 Price网络
如何看懂Price网络的代码?#! /usr/bin/env python # We will need some things from several places from __future__ import division, absolute_import, print_function import sys if sys.version_info < (3,): range = xrange import os from pylab import * # for plotting from numpy.random import * # for random sampling seed(42) # We need to import the graph_tool module itself from graph_tool.all import * # let's construct a Price network (the one that existed before Barabasi). It is # a directed network, with preferential attachment. The algorithm below is # very naive, and a bit slow, but quite simple. # We start with an empty, directed graph g = Graph() # We want also to keep the age information for each vertex and edge. For that # let's create some property maps v_age = g.new_vertex_property("int") e_age = g.new_edge_property("int") # The final size of the network N = 100000 # We have to start with one vertex v = g.add_vertex() v_age[v] = 0 # we will keep a list of the vertices. The number of times a vertex is in this # list will give the probability of it being selected. vlist = [v] # let's now add the new edges and vertices for i in range(1, N): # create our new vertex v = g.add_vertex() v_age[v] = i # we need to sample a new vertex to be the target, based on its in-degree + # 1. For that, we simply randomly sample it from vlist. i = randint(0, len(vlist)) target = vlist[i] # add edge e = g.add_edge(v, target) e_age[e] = i # put v and target in the list vlist.append(target) vlist.append(v) # now we have a graph! # let's do a random walk on the graph and print the age of the vertices we find, # just for fun. v = g.vertex(randint(0, g.num_vertices())) while True: print("vertex:", int(v), "in-degree:", v.in_degree(), "out-degree:", v.out_degree(), "age:", v_age[v]) if v.out_degree() == 0: print("Nowhere else to go... We found the main hub!") break n_list = [] for w in v.out_neighbours(): n_list.append(w) v = n_list[randint(0, len(n_list))] # let's save our graph for posterity. We want to save the age properties as # well... To do this, they must become "internal" properties: g.vertex_properties["age"] = v_age g.edge_properties["age"] = e_age # now we can save it g.save("price.xml.gz") # Let's plot its in-degree distribution in_hist = vertex_hist(g, "in") y = in_hist[0] err = sqrt(in_hist[0]) err[err >= y] = y[err >= y] - 1e-2 figure(figsize=(6,4)) errorbar(in_hist[1][:-1], in_hist[0], fmt="o", yerr=err, label="in") gca().set_yscale("log") gca().set_xscale("log") gca().set_ylim(1e-1, 1e5) gca().set_xlim(0.8, 1e3) subplots_adjust(left=0.2, bottom=0.2) xlabel("$k_{in}$") ylabel("$NP(k_{in})$") tight_layout() savefig("price-deg-dist.pdf") savefig("price-deg-dist.png")
相关文章推荐
- Rectangle Area
- 新手整合springmvc+velocity过程
- 使用Go构建RESTful的JSON API
- Codeforces Round #356 (Div. 2) A
- Studio 更新的时候提示Connection failed (connect timed out). Please check network connection and try again.
- hadoop环境搭建遇到的问题:-bash: jps: command not found
- 【Linux】常见进程调度
- WinForm多线程编程与Control.Invoke的应用
- 在LINUX下调一个程序老说找不到表,但是我明明是建了表的 mysql表名忽略大小写
- QQ能上网页打不开解决办法
- 第四百三十三天 how can I 坚持
- 发现小米MUI系统有bug
- 动态规划2-最长上升子序列(算法基础 第5周)
- 新作品上线了啦,等你来玩!!!
- 来电话显示电话归属地
- 构建之法 阅读笔记06
- 结构体、共用体、枚举
- 深入了解JVW
- Codeforces Round #356 (Div. 1) 题解(待补)
- HDU 1213 How Many Tables (并查集,连通分支数,两种方式)