<p>所以我找到了一个解决办法。从GraphView的文档中:</p>
<blockquote>
<p>The argument g must be an instance of a Graph class. If specified,
vfilt and efilt select which vertices and edges are filtered,
respectively. These parameters can either be a boolean-valued
PropertyMap or a ndarray, which specify which vertices/edges are
selected, or an unary function that returns True if a given
vertex/edge is to be selected, or False otherwise.</p>
</blockquote>
<p>因此,顶点遮罩也可以由一元函数指定,该函数表示顶点是否是子图的一部分:</p>
<pre><code>def get_subgraph(graph, vertices):
f = lambda x: x in vertices
return graph_tool.GraphView(graph, f)
</code></pre>
<p>而且,不知怎的,这个版本确实有效</p>
<pre><code>subgraph = get_subgraph(graph, graph.get_vertices())
print(graph.get_vertices())
print(subgraph.get_vertices())
</code></pre>
<p>输出:</p>
<pre><code>[0 1 2 3 4 5 6 7 8 9]
[0 1 2 3 4 5 6 7 8 9]
</code></pre>
<p>因此,创建包含0作为顶点的GraphView并不是不可能的,如果您尝试使用numpy数组,它显然不起作用</p>
<p>这个答案对我来说很有用,但是如果有人有更好的解决方法(特别是因为这个方法使得返回大型图的子图要慢得多),或者如果有人知道为什么会出现这种奇怪的行为,我仍然会感兴趣</p>
<p>编辑:</p>
<p>此实现利用numpy来计算顶点掩码,而不是本机python“in”操作,因此,对于较大的图形,计算速度要快得多:</p>
<pre><code>def get_subgraph(graph, vertices):
property_map = graph.new_vertex_property("bool")
property_map.a = np.isin(graph.get_vertices(), vertices)
return graph_tool.GraphView(graph, property_map)
</code></pre>