博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
graph-tool 练习
阅读量:6471 次
发布时间:2019-06-23

本文共 5891 字,大约阅读时间需要 19 分钟。

  • 如何使用graph-tool模块,如何导入?如何使用graph,使用其算法?
  • 如何使用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 izipfor 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 matchfor 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_properties vp
    edge_properties ep
    graph_properties gp

  • 区分类型,名字和值!!!
>>> 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 placesfrom __future__ import division, absolute_import, print_functionimport sysif sys.version_info < (3,):    range = xrangeimport osfrom pylab import *  # for plottingfrom numpy.random import *  # for random samplingseed(42)# We need to import the graph_tool module itselffrom 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 graphg = Graph()# We want also to keep the age information for each vertex and edge. For that# let's create some property mapsv_age = g.new_vertex_property("int")e_age = g.new_edge_property("int")# The final size of the networkN = 100000# We have to start with one vertexv = 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 verticesfor 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_ageg.edge_properties["age"] = e_age# now we can save itg.save("price.xml.gz")# Let's plot its in-degree distributionin_hist = vertex_hist(g, "in")y = in_hist[0]err = sqrt(in_hist[0])err[err >= y] = y[err >= y] - 1e-2figure(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")

转载地址:http://gpvko.baihongyu.com/

你可能感兴趣的文章
js获取当前时间的前一天/后一天
查看>>
Python字符串的格式化
查看>>
C#反射---属性
查看>>
服务器常用的状态码及其对应的含义如下
查看>>
zoom和transform:scale的区别
查看>>
黄聪:PHP 防护XSS,SQL,代码执行,文件包含等多种高危漏洞
查看>>
svn status 显示 ~xx
查看>>
常用HiveQL总结
查看>>
[转]使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(三)-- Logger
查看>>
POJ 3311 Hie with the Pie(状压DP + Floyd)
查看>>
Security updates and resources
查看>>
深入理解JavaScript系列(25):设计模式之单例模式
查看>>
DNS为什么通常都会设置为14.114.114.114
查看>>
给定一个序列,判断该序列是否为二叉树查找树的后序遍历序列
查看>>
Sqoop架构(四)
查看>>
golang copy函数
查看>>
《你有多少问题要请示》精华集粹
查看>>
深度 | 机器学习敲门砖:任何人都能看懂的TensorFlow介绍【转】
查看>>
leveldb学习:DBimpl
查看>>
[Recompose] Stream Props to React Children with RxJS
查看>>