前回のグラフの作成方法に引き続き、今回は、ノードとリンクの追加・編集・検索について。
ノードの追加
既に存在するグラフにノードを追加するには、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はメソッドではなくて、メンバ変数だということ。()を付けないように。
コメント
コメントを投稿