NetworkX(主にDiGraph)の使い方
- import networkx as nx していることを仮定する。
- import matplotlib.pylab as plt も仮定する。pylabなので、as pylab が良かったか?
- pydotとPyYAMLは不要だから入れてない。
- A node can be any hashable Python object except None. たいてい何でも使える。
- nbunchはNetworkX特有の概念で、頂点集合の表現。とりあえず、リストと思ってもいい。
An nbunch is any iterable container of nodes - ebunchも同様。An iteratable container of edge tuples
- DiGraphが有向グラフで、ループを認める。が、多重辺は認めてないので、多重辺が必要ならMultiDiGraphを使う。辺に属性(例えば多重度)が付けられるので、たいていはDiGraphで間に合いそうだ。
- 辺に付けられた数値を重さ(weight)と呼ぶ。辺重さ付きのグラフが「ネットワーク」の定義。最短経路問題などはネットワークに対して定式化される。
- 初期化データはいろいろ使える。
- edge list
- NetworkX graph
- NumPy matrix
- NumPy 2d ndarray
- SciPy sparse matrix
- PyGraphviz AGraph
- edge listは、辺を表現するタプルのリスト。
- やってみたら、DiGraph({1:[2,3], 2:[3, 4]}) もOKだった。
- 属性付きの辺は、(u, v, dict) というタプルで、dictは辞書。
- グラフ全体、頂点、辺のそれぞれに属性を付けられる。数値属性のどれかを(必要に応じて)weightと呼ぶ。
- G.graph でグラフ属性にアクセスできる。
- G.node[1] などで頂点属性にアクセスできる。
- G[1][2]、G.edge[1] とかで辺属性にアクセスできる。
- G[1]は辺属性の辞書。
- グラフ描画は、nx.draw(G); plt.show()
- 有向グラフを逆転したいなら、reverse()
- コピー(クローン)は copy()
- 無向グラフとしてコピーなら、to_undirected()。to_undirected(reciprocal=True)とすると、両方向有向辺(辺の対)が無向辺になる。
- コンストラクタ G=DiGraph(D) はシャローコピー。to_undirectedはディープコピー。
- 頂点の入次数を知りたいなら、in_degree(nbunch) で取れる。nbunchが単一頂点なら数値、頂点集合なら辞書。
- in_degreeは辞書を返すが、イテレータを返す in_degree_iterってのもある。
- out_degreeも同じ。
- order() がノード数
- number_of_nodes() でも同じ。
- len(G) でもノード数
- size() が辺数
- number_of_edges() でも同じ。
- self loopの情報が詳しく取れる。
- nodes_with_selfloops()
- selfloop_edges()
- number_os_selfloops()
- 頂点集合から誘導されるサブグラフは、subgraph(nbunch)で作れる。