удаление вершин делает недействительными свойства вершин в графическом инструменте - PullRequest
0 голосов
/ 20 апреля 2020

Я столкнулся с этой маленькой проблемой с графиком. Мне нужно безопасно удалить вершины без входных и выходных ребер (с общей степенью == 0 на практике), для этой цели я написал эту маленькую функцию

def clean(self):
        v_list = []
        for v in self.g.get_vertices():
            if self.g.get_out_degrees([v]) + self.g.get_in_degrees([v]) < 1:
                v_list.append(v)

        self.g.remove_vertex(v_list)

, где self.g - это график инструмент Graph экземпляр.

Проблема в том, что карта свойств, содержащая метки вершин, становится недействительной после этого. Однако это, кажется, выбор дизайна, поскольку каждый раз было бы дорого реорганизовывать карту свойств, как указано здесь .

Поэтому мне было интересно, как сохранить свои ярлыки. Решение, которое я нашел, состоит в том, чтобы отфильтровать вершины вместо их удаления

def clean(self):
        clean_map = self.g.new_vertex_property("bool")
        for v in self.g.get_vertices():
            if self.g.get_out_degrees([v]) + self.g.get_in_degrees([v]) < 1:
                clean_map[v] = False
            else:
                clean_map[v] = True

        self.g.set_vertex_filter(clean_map)

, это больше не делает карту недействительной, поскольку вершины не переупорядочиваются, но было бы лучше иметь вершины и метки карта заказана для того, что мне нужно сделать потом.

Есть предложения?

1 Ответ

0 голосов
/ 21 апреля 2020

Удаление вершин или ребер НЕ делает недействительными карты свойств в Graph-Tool.

Вот пример:

>>> g = Graph()                                                             
>>> g.add_vertex(10);                                                      
>>> p = g.vertex_index.copy()                                               
>>> p.fa                                                                    
PropertyArray([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> g.remove_vertex(5)                                                 
>>> p.fa                                                                    
PropertyArray([0, 1, 2, 3, 4, 6, 7, 8, 9])

Таким образом, нет необходимости использовать фильтрацию для этого.

...