igraph を使用して Python でコードを記述しようとしましたが、while ループを使用してエッジを追加しようとすると、このエラーが発生しました
while(i<k)
g.add_vertices(theInts[i])
i=i+1
g.add_edges([(theInts[i-1],theInts[i])])
インデックス作成が問題になる可能性があると思ったので、ifステートメントも含めましたが、それは問題ではないようです。
助けてください!!!
g
これはすべて、頂点に何があるかに依存すると思います。空の から開始するとg
、頂点しかないため、2 つの異なる頂点で0
呼び出そうとしてもうまくいきません。add_edges
さらに頂点を追加する必要があります。もちろん、これはすべて、ループの前にグラフがどのように見えるかによって異なりますi
。
を使用して、グラフに関する簡単な情報を表示できますprint
。例えば、
>>> import igraph
>>> graph = igraph.Graph()
>>> print graph
Undirected graph (|V| = 1, |E| = 0)
0 から開始する場合i
、最初はループで頂点を追加しません。したがって、エッジを追加しようとすると、存在しない頂点に追加しようとしています。
>>> graph.add_vertices(0)
<igraph.Graph object at 0xcea850>
>>> print graph
Undirected graph (|V| = 1, |E| = 0)
>>> graph.add_edges([(0, 1)])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
igraph.core.InternalError: Error at type_indexededgelist.c:245: cannot add edges, Invalid vertex id
それが問題でない場合は、エッジを印刷して、目的のものと一致するかどうかを確認してください。
>>> graph.add_vertices(5)
<igraph.Graph object at 0xcea850>
>>> print graph
Undirected graph (|V| = 6, |E| = 3)
>>> graph.add_edges([(1, 1), (2, 3), (3, 5)])
<igraph.Graph object at 0xcea850>
>>> graph.get_edgelist()
[(1, 1), (2, 3), (3, 5)]
また、完全な TraceBack があると、もう少し役立つ場合があります。
編集:あなたのコメントに基づいて
つまり、次のような構造があると言っています。
>>> graph = igraph.Graph()
>>> print graph
Undirected graph (|V| = 1, |E| = 0)
頂点 2 だけを追加しますか? igraphでそれができるかどうかはわかりません。各頂点を順番に配置する必要があるようです。頂点があるかどうかを確認し、必要に応じて追加できます。これらのグラフは 0 から始まることに注意してください。このようなもの。
>>> vertices = 1, 2, 13, 4, 21, 5
>>> map_graph = igraph.Graph()
>>> print map_graph
Undirected graph (|V| = 1, |E| = 0)
>>> map_graph.add_vertices(max(vertices))
<igraph.Graph object at 0xceaa50>
>>> print map_graph
Undirected graph (|V| = 22, |E| = 0)
>>> map(map_graph.add_edges, zip(vertices, vertices[1:]))
[<igraph.Graph object at 0xceaa50>, <igraph.Graph object at 0xceaa50>, <igraph.Graph object at 0xceaa50>, <igraph.Graph object at 0xceaa50>, <igraph.Graph object at 0xceaa50>]
>>> print map_graph
Undirected graph (|V| = 22, |E| = 5)
>>> map_graph.get_edgelist()
[(1, 2), (2, 13), (4, 13), (4, 21), (5, 21)]
または、マップが気に入らない場合は、ループすることができます。
>>> vertices = 1, 2, 13, 4, 21, 5
>>> loop_graph = igraph.Graph()
>>> print loop_graph
Undirected graph (|V| = 1, |E| = 0)
>>> loop_graph.add_vertices(max(vertices))
<igraph.Graph object at 0xcea950>
>>> print loop_graph
Undirected graph (|V| = 22, |E| = 0)
>>> for pair in zip(vertices, vertices[1:]):
... loop_graph.add_edges(pair)
...
<igraph.Graph object at 0xcea950>
<igraph.Graph object at 0xcea950>
<igraph.Graph object at 0xcea950>
<igraph.Graph object at 0xcea950>
<igraph.Graph object at 0xcea950>
>>> print loop_graph
Undirected graph (|V| = 22, |E| = 5)
>>> loop_graph.get_edgelist()
[(1, 2), (2, 13), (4, 13), (4, 21), (5, 21)]
ただし、おそらくこれを行うより良い方法があります。これが探しているものでない場合は、元の質問をより詳細に編集し、実際のコードをいくつか編集してください。