igraphの使い方2 ~ ノードとリンクの追加・参照



前回のグラフの作成方法に引き続き、今回は、ノードとリンクの追加・編集・検索について。

ノードの追加


既に存在するグラフにノードを追加するには、add_verticesメソッドを使えば良い。引数は、追加したいノードのnameアトリビュートの値のリストだ。

g = Graph()
g.add_vertices([2,4,3,5])

上の例では、nameアトリビュートのあるノードが4つ追加される。それぞれのnameアトリビュートの値が、2,4,3,5である。間違えてはいけないのが、ノードの順番はnameアトリビュートの値で並び替えられたりはしない、ということだ。つまり、1番目のノードのnameは2、2番目のノードのnameは4、としてグラフgに追加される。

nameアトリビュートの値の型はなんでもよい。上の例はたまたまintegerにしているだけ。個人的には、intergerよりstringの方が、混乱しにくいかと思う。

ノードの参照

ノードオブジェクトを参照するためには、vsを使う。

例:
g = Graph()
g.add_vertices([0,1,2,3,4])
print(g.vs[1]) # 2番目のノードの情報を出力
print(g.vs[1].attribute_names()) #ノード情報のアトリビュート名を出力
print(g.vs[1].attributes()) # 2番目のノードの各アトリビュートのKeyと値を出力

g.vsで、グラフ中の全てのノードのリストが見れるため、その中の何番目のノードかを、要素番号で指定してやれば、ノードを参照できる。

しかし大抵の場合、ノードの名前(nameアトリビュートの値)は覚えていても、何番目に追加されたノードか、は覚えていないだろう。

そこで、findメソッドを用いる。findメソッドを使えば、nameアトリビュートの値を指定して、ノードを検索することが出来る。

g.vs.find(name=2)

上のコードでは、nameが2のノード、すなわち、3番目のノードが返される。

もしnameをstringにしていたら、
g = Graph()
g.add_vertices(["a","b","c"])
それに合わせて、
g.vs.find(name="b")
というように、string型で検索すればよい。

findメソッドは、上と同様のやり方で、name属性以外でもノードを検索することができる。ただし、ノードシーケンスの中で最初にヒットしたノードだけがreturnされる。

リンクの追加


リンクの追加は、add_edgesを使う。add_edgesの引数は、リンクに隣接する2つのノードのタプルのリストだ。

g=Graph()                         # グラフ生成
g.add_vertices(["1","0","3","2"]) # ノード追加
g.add_edges([("0","1"),("1","2"),("2","3")])

存在しないノードにリンクを付けようとすると、エラーを吐く。適切に例外処理をしていないと、異常終了するので、注意が必要だ。

リンクの参照


リンクの参照はノードの参照よりも簡単だ。上のようにリンクを追加した場合に、ノード"1"とノード"2"の間のリンクを参照するためには、以下のようにする。

g.es('1','2')

リンクの両端のノードを調べたいときは、tupleメンバ変数を使う。下の例は、グラフ中の全リンクの両端のノードを出力する。
for e in g.es():
    e.tuple

ここで注意なのが、tupleはメソッドではなくて、メンバ変数だということ。()を付けないように。

コメント