2013-10-14 2 views
0

У меня есть график G1 с 50 узлами и 100 ребрами. Все ребра взвешиваются. Я создал список ребер (отсортированных по заранее определенному порядку, удаления специфических кромок с большими значениями), и они индексируются как:iGraph Python, конвертировать список ребер в кортеж и add.edges

Edgelist: [75, 35, 32, 1, ...] 

Я хочу, чтобы добавить края к другому графа G2 в партиях из 10 (чтобы сохранить время вычисления), но add.edges, похоже, хочет получить список вершинных партов. Итак,

1) Как преобразовать список Edge выше в список кортежей, например. [(40,2), (10,1), (10,11), (0,0), ...]. Я пробовал цикл с G1.es [edge] .tuple, но iGraph читает переменную [edge] как атрибут, тогда как если вы просто пишете файл G1.es [75] .tuple, он отлично работает.

2) Как я могу найти весы из G1 и добавить их в G2 в партиях по 10?

Благодаря

+0

Является ли "Список Край" над списком ребер идентификаторов, относящихся к G1? –

+0

Да, это так. Я опубликовал ниже мое решение, но, может быть, есть способ ускорить его? – user2524828

+0

Я опубликовал возможную реализацию ниже в качестве ответа. –

ответ

0
  1. Вы должны знать, что индексирование G1.es с одним номером вернет объект типа Edge, а при индексировании его списком чисел будет возвращен объект типа EdgeSeq. Edge объекты имеют свойство с именем tuple, но EdgeSeq объекты не делают, так вот почему G1.es[edgelist].tuple не работает Однако, вы можете сделать это:

    sorted_tuples = [edge.tuple for edge in G1.es[edgelist]] 
    

    Вы также можете извлечь значение weight атрибута непосредственно из EdgeSeq объект:

    sorted_weights = G1.es[edgelist]["weight"] 
    
  2. Здесь вы можете использовать тот факт, что если G2 имеет М края и вы добавляете м дополнительных ребер, то идентификаторы этих новых ребер будут находиться в диапазоне от M (включительно) до М + m (исключая usive):

    M = G2.ecount() 
    m = len(sorted_tuples) 
    G2.add_edges(sorted_tuples) 
    G2.es[M:(M+m)] = sorted_weights 
    
0

1) График G1 была нежелательные края удалены уже. Edgelist - это крайний порядок для G1.

tuple_list=[] 
for e in G1.es: 
    tuple_list.append(e.tuple) 

sorted_tuples=[tuple_list[i] for i in Edgelist] 
sorted_weights = [G1.es['weight'][o] for o in Edgelist] 

2) Добавить ребра - это может быть просто зациклировано для всех ребер в G1. Пример ниже первых 10.

edges_to_add=sorted_tuples[0:10] 
weights_to_add=sorted_weights[0:10] 

G2.add_edges(edges_to_add) 

for edge in range(len(edges_to_add)): 
    G2.es[G2.get_eid(edges_to_add[edge][0],edges_to_add[edge][1],0)]['weight'] = weights_to_add[edge] 

вес Пограничный добавляется по отдельности, что это немного медленно, но не кажется, что должно быть способом добавления краев весов в партии в iGraph