graph_tool 属性 地图在 GraphViews 中工作吗?

Do graph_tool property maps work in GraphViews?

当基础图本身是一个 GraphView 对象时,python graph_tool 包中的 GraphView 对象似乎无法正常工作。这是一些显示问题的代码:

from graph_tool import *
import numpy as np

g = Graph()
p1 = g.new_vertex_property("bool")
gv1 = GraphView(g, p1)
p2 = gv1.new_vertex_property("bool")
gv2 = GraphView(gv1, p2)

print gv1.num_vertices()

这会按预期打印 0;我们还没有添加任何顶点。

v = g.add_vertex()
p1[v] = True
print gv1.num_vertices()

这会按预期打印 1。更改 属性 地图会更新视图。

for w in gv1.vertices():
    p2[w] = True
print gv2.num_vertices()

这会打印出 0,这是我没想到的。更改 属性 地图似乎不会更新视图。

p2[v] = True
print gv2.num_vertices()

使用 g 中的顶点对象而不是 gv1 似乎没有帮助;再次打印 0。

gv2 = GraphView(gv1, p2)
print gv2.num_vertices()

这会打印 1,表明问题不在于 属性 地图,而在于视图。

我错过了什么?

当 GraphView objets composed,即从另一个 GraphView 对象生成时,需要使用 numpy.logical_and() 组合底层 属性 映射,这意味着需要复制。因此,在您的示例中,gv2 使用的内部 属性 映射将是 copy p2p1 的组合,因此如果您修改 p1p2,它在创建后将不再影响 gv2

如果你想改变gv2使用的地图,你可以通过gv2.get_edge_filter()获得它。