Итак, я нашел обходной путь. Из документации GraphView:
Аргумент g должен быть экземпляром класса Graph. Если указано, vfilt и efilt выбирают, какие вершины и ребра фильтруются соответственно. Эти параметры могут быть либо PropertyMap с логическим значением, либо ndarray, которые определяют, какие вершины / ребра выбраны, или унарной функцией, которая возвращает True, если данная вершина / ребро должна быть выбрана, или False в противном случае.
Таким образом, маска вершины также может быть указана с помощью унарной функции, которая сообщает, является ли вершина частью подграфа:
def get_subgraph(graph, vertices):
f = lambda x: x in vertices
return graph_tool.GraphView(graph, f)
И каким-то образом эта версия действительно работает!
subgraph = get_subgraph(graph, graph.get_vertices())
print(graph.get_vertices())
print(subgraph.get_vertices())
Вывод:
[0 1 2 3 4 5 6 7 8 9]
[0 1 2 3 4 5 6 7 8 9]
Так что на самом деле невозможно создать GraphView, который включает 0 как вершину, это просто очевидно не работает, если вы попытаетесь сделайте это с массивом numpy.
Этот ответ работает для меня, но мне все равно было бы интересно, есть ли у кого-нибудь лучший обходной путь (тем более, что он намного медленнее возвращает подграф для большого графа ), или если кто-то знает, почему возникает такое странное поведение.
EDIT:
Эта реализация использует numpy для вычисления маски вершин вместо встроенной операции python "in" и, следовательно, намного быстрее для больших графиков:
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)