2013-07-18 2 views
0

Если у вас есть ориентированный граф с несколькими границами, как вы это делаете?Вопросы с красным питоном igraph

  1. Для вершин I и J, перечислить все ребра от I до J.
  2. Удалить все ребра в графе с весом более 10.

В 1 можно перечислить все исходящие ребра а затем фильтровать по узлу назначения. Это кажется потенциально неэффективным, есть ли какой-то способ просто получить края напрямую? Для 2 я могу перечислить все ребра, посмотреть каждый вес, а затем удалить край, если это необходимо. Есть ли опрятный идиоматический способ сделать это?

+2

Как реализован график? В каких структурах данных у вас есть доступ? И последнее, но не в последнюю очередь, то, что вы пробовали (перевод: добро пожаловать в SO, мы будем рады помочь, но мы не являемся кодовым сервисом. Покажите нам, что вы пытались (перевод: мы не собираемся делать свой дом/работать для вас))? – inspectorG4dget

+0

График считывается с использованием метода nct для чтения ncol. Я использую стандартный python plus igraph, поэтому имею доступ к этим библиотекам как минимум. – phoenix

+0

Примечание. Это вопрос о том, как взаимодействовать с библиотекой графиков с открытым исходным кодом, а не о том, как реализовать операции. (Сначала я, хотя «я» был опечаткой.) – user2357112

ответ

4

Что касается № 1, к сожалению, нет более простого решения, чем тот, который вы упомянули (т. Е. Запрос всех исходящих ребер и фильтрация на основе адресата). Ядро C igraph имеет функцию, называемую igraph_get_eids_multi, которая будет делать то, что вы хотите, но для этой функции не существует соответствующего интерфейса Python.

Что касается # 2, вы можете сделать это (при условии, что g ваш объект графа, weight это имя атрибута края удерживающей веса, и gt обозначает «больше»):

g.es.select(weight_gt=10).delete() 

, где g.es представляет последовательность краев всего графика, а его метод select подмножает последовательность ребер на основе некоторых критериев (более подробную информацию см. В документации EdgeSeq.select), возвращая еще EdgeSeq. Метод delete() отфильтрованной пограничной последовательности затем удаляет ребра.

+0

Я понимаю, что я тоже не могу работать # 1. Если я перечислил все исходящие ребра из I, то я не знаю, как получить его как список кортежей, чтобы я мог фильтровать конечную вершину J. – phoenix

+2

'[edge for edge in g.es [g.incident (source) ] if edge.target == target] 'должен делать трюк. Вы также можете использовать '[edge.index для edge ...', если вам нужен только краевой индекс. –

+0

Спасибо вам большое! – phoenix

Смежные вопросы