LoginSignup
1
0

More than 3 years have passed since last update.

graph-toolでcsv形式のリンクリストを読み込む

Posted at

やりたいこと

graph-toolで以下のようなリンクリスト(source,dest,weight)形式のファイルを読み込むことを考える。

link_list.csv
Alice,Bob,2
Bob,Charlie,5
Charlie,Alice,3

コード

このファイルをgrpah-toolで読み込むには以下のようにcsvモジュールを使ってパースする。

load_csv_link_list.py
import csv
import graph_tool.all as gt

nodes = set()
rows = []

with open('link_list.csv') as f:
    reader = csv.reader(f)
    rows = [row for row in reader]

for row in rows:
    nodes.add(row[0])
    nodes.add(row[1])

nodes = list(nodes)
g = gt.Graph()
g.vp['name'] = g.new_vp('string')

for n in nodes:
    v = g.add_vertex()
    g.vp['name'][v] = n

# set edges
g.ep['weight'] = g.new_ep('double')

for row in rows:
    s = nodes.index(row[0])
    t = nodes.index(row[1])
    w = float(row[2])
    vs = g.vertex(s)     # => get vertex object from the index
    vt = g.vertex(t)
    e = g.add_edge(vs, vt)
    g.ep['weight'][e] = w

やっていることは以下の通り

  • まずはcsvファイルの内容全てを読み込んでしまい、ノードの一覧nodesを作る
    • ユニークな物だけを取り出したいので、setに格納し、その後listに変換している
  • ノード名はgraph に文字列の vertex_property name を作成して g.vp['name'] = g.new_vp('string') 格納している
    • g.vpはノードに対する属性(vertex_property)を保持している
  • エッジの重みは浮動小数点型 edge_property weight を作成して、格納している

グラフを可視化してみるとこのようになる。

結果

ちなみにこのグラフを可視化した結果はこのようになる。

image.png

pos = gt.arf_layout(g)
gt.graph_draw(g, pos=pos, vertex_text=g.vp.name, vertex_font_size=10)
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0