やりたいこと
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
を作成して、格納している
グラフを可視化してみるとこのようになる。
結果
ちなみにこのグラフを可視化した結果はこのようになる。
pos = gt.arf_layout(g)
gt.graph_draw(g, pos=pos, vertex_text=g.vp.name, vertex_font_size=10)