2014-09-14 1 views
3

У меня есть некоторые реляционные данные в формате списка списков, которые я бы хотел импортировать в iGraph.Graph(). Список списков содержит повторяющиеся ребра, и в конечном итоге я хотел бы добавить кромку для повторяющихся ребер. Однако в настоящее время я не могу понять, что я делаю неправильно, когда просто пытаюсь добавить ребра к графику, за вычетом весового коэффициента.Загрузка данных из списка списков (представляющих ребра) в графике igraph в python

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

Что я делаю неправильно, загружая эти края в график?

* Как я могу изменить процесс загрузки грани, чтобы сначала искать край в графе, если не найден, добавьте ребро, и если он найден, увеличьте вес этого края на 1, *

ДАННЫЕ

In [60]: edges 

Out[60]: [['a', 'b'], 
      ['a', 'b'], 
      ['a', 'b'], 
      ['b', 'a'], 
      ['a', 'c'], 
      ['c', 'a'], 
      ['c', 'd'], 
      ['c', 'd'], 
      ['d', 'c'], 
      ['d', 'c']] 

IGRAPH код для загрузки ребер в GRAPH и ошибках

In [61]: # extract vertices for edges list 
      vertices = [] 
      for line in edges: 
       nodes.append(line[0]) 
       nodes.append(line[1]) 

      # find unique vertices 
      uniq_vertices = set(sorted(nodes)) 

In [62]: # create an empty graph 
      g = igraph.Graph() 

In [63]: # add vertices to the graph 
      g.add_vertices(uniq_vertices) 

In [64]: # for each line in the edges list, check to see if it's already in the graph, and if not, add it to the graph. 
      for line in edges: 
       if not line in g.get_edgelist(): 
        g.add_edges(edges)  

--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-64-04a376c78860> in <module>() 
     2 for line in edges: 
     3  if not line in g.get_edgelist(): 
----> 4   g.add_edges(edges) 

C:\Users\Curtis\Anaconda\lib\site-packages\igraph\__init__.pyc in add_edges(self, es) 
    228   endpoints. Vertices are enumerated from zero. 
    229   """ 
--> 230   return GraphBase.add_edges(self, es) 
    231 
    232  def add_vertex(self, name=None, **kwds): 

ValueError: no such vertex: 'a' 

ответ

6

Проблема, вероятно, здесь (по крайней мере, эта часть кода не имеет смысла для меня):

for line in edges: 
    if not line in g.get_edgelist(): 
     g.add_edges(edges) 

Здесь вы проверить line в g.get_edgelist(), и будьте уверены, что он не будет, потому что ваш список edges содержит списки, в то время как g.get_edgelist() возвращает кортежи. Затем вы добавляете все кромки, а не только те, которые вы проверили.

У меня есть альтернативная версия вашего кода, которая, похоже, выполняет эту работу для меня. Обратите внимание, что я не исключаю кратных ребер при создании графика - добавить их, а затем просто попросить igraph свернуть их в один и добавить их вес вместе:

import igraph 

edges = [['a', 'b'], 
     ['a', 'b'], 
     ['a', 'b'], 
     ['b', 'a'], 
     ['a', 'c'], 
     ['c', 'a'], 
     ['c', 'd'], 
     ['c', 'd'], 
     ['d', 'c'], 
     ['d', 'c']] 

# collect the set of vertex names and then sort them into a list 
vertices = set() 
for line in edges: 
    vertices.update(line) 
vertices = sorted(vertices) 

# create an empty graph 
g = igraph.Graph() 

# add vertices to the graph 
g.add_vertices(vertices) 

# add edges to the graph 
g.add_edges(edges) 

# set the weight of every edge to 1 
g.es["weight"] = 1 

# collapse multiple edges and sum their weights 
g.simplify(combine_edges={"weight": "sum"}) 
+3

Я думаю, чтобы создать график, более простой способ было бы использовать TupleList: edge = [('a', 'b'), ('a', 'b'), ('a', 'b'), ('b', 'a'), , ('a', 'c'), ('c', 'a'), ('c', 'd'), ('c', 'd'), ('d', 'c'), , ('d', 'c')] g = Graph.TupleList (направленный = True, edge = edge) – Max