Умный способ удалить взаимные края с Python-igraph 0.7

Пусть L - ориентированный граф, я должен удалить взаимные ребра L. Помните, что два ребра взаимны, если они имеют тип a --->b и b ---->a.

Например L.is_mutual() возвращает список логических значений, каждое логическое значение соответствует ребру. Значение true возвращается для заданного ребра a -> b, если в исходном графе существует другое ребро b -> a.

Как пользоваться L.is_mutual() для удаления взаимных краев?

Возможное решение (медленно):

 L.delete_edges([l[i] for i in range(len(l)) if mut[i]==True])

1 ответ

Решение

Есть ли l содержать список ребер вашего графа? В этом случае ваше решение будет медленным, потому что для удаления каждого ребра igraph должен искать свой идентификатор с конечных точек (так как вы даете конечные точки delete_edges а не крайний индекс). поскольку delete_edges может работать и с краевыми индексами, быстрее сказать:

L.delete_edges(index for index, mut in enumerate(L.is_mutual()) if mut)

Еще один (несколько медленнее, но более лаконичный) вариант:

L.es.select(_is_mutual=True).delete()
Другие вопросы по тегам