3

Igraph を使用して、同じエッジ属性を共有するすべての頂点 (頂点 ID)を検索したいと思います (したがって、このような多数の頂点が存在する可能性があります)。これは、「道路」、たとえば「ルート 69」(エッジ属性) 上のすべての「村」(グラフの頂点) を見つけたい場合に非常に便利です。

Igraph でこれを行う簡単な方法はありますか? 多分私はそれを複雑にしすぎました。

実際に必要なのは次の反対です:g.es.select(_within=g.vs[2:5])または

>>> men = g.vs.select(gender="m")
>>> women = g.vs.select(gender="f")
>>> g.es.select(_between=(men, women))

エッジ属性は知っているが、頂点がわからないからです。

エッジを選択し、関連するすべての頂点が返されることを願っています。

今は疲れているだけかもしれませんが、この問題を回避する方法が見つかりません。誰かが正しい方法で私を助けてくれれば幸いです。または、チュートリアルやドキュメントで見逃している方法があるかもしれません。これには非常に簡単な方法があるようです。アドバイスをよろしくお願いします!

4

2 に答える 2

4

次のことができるはずです。

r69edges = g.es.select(name_eq='Route69')  #Select all edges where name=='Route69'
sg = r69edges.subgraph()  #Create a subgraph containing only the selected edges (and attached vertices)
village_verts = sg.vs.select(name_eq='villages')  #Select the vertices where name=='villages'

これは、'villages' と 'Route69' が頂点とエッジの 'name' という属性に格納されていることを前提としています... 属性に合わせて適切に調整してください。

もちろん、必要に応じて、これをすべて 1 行にまとめることができます。

village_verts = g.es.select(name_eq='Route69').subgraph().vs.select(name_eq='villages')

これが最も効率的な方法かどうかはわかりませんが (ドキュメントにショートカットが表示されていません)、求めているものが得られるはずです。

于 2013-07-01T14:17:21.600 に答える
4

まず、Route 69 のすべてのエッジを選択します。

edges = g.es.select(name="Route69")

次に、選択したエッジを繰り返し処理し、頂点の端点を収集します。

vertices = set()
for edge in edges:
    vertices.update(edge.tuple)

これにより、 name を持つ少なくとも 1 つのエッジに付随するすべての頂点の頂点 ID を含むセットが得られますRoute69。VertexSeq が必要な場合は、次のように簡単に実行できます。

vertices = g.vs[sorted(vertices)]
于 2013-07-01T15:52:18.783 に答える