NetworkX(主にDiGraph)の使い方 (2)
- 孤立頂点も表現できるので、初期化には辞書形式がいいみたい; nx.DiGraph({'a':['c', 'd'], 'b':, 'c':['a'], 'e':})、bとeは孤立している。JSONで言うプロパティが、各頂点ごとのスターを表現している。孤立頂点以外は明示的に [] を書かなくてもいい。
- 上記の形式は、dict_of_listsと呼ぶ。変換はメソッドじゃなくて、nx.to_dict_of_lists関数。nx.to_dict_of_lists関数に頂点集合を指定して誘導サブグラフを取ることもできる。
- 辺の属性をエンコードしたいときは、dict_of_dicts関数。
- nx.to_edgelist だと孤立頂点は取れない。辺属性は取れる。
- G.graphで取れるグラフ属性、G.node[x] で取れる頂点属性がエンコードできない。
- Catyのgvモジュールのデータ型を使えばOKだ。dict_of_lists形式。dict_of_dicts形式もなんとかなるか?
- JSONとのIOは、from networkx.readwrite import json_graph as jg とかする。
- jg.node_link_data(G) でJSONデータ。
- jg.node_link_graph(d) でその逆。だが、なんか制約があるようだ。
- jg.adjacency_data(G), jg.adjacency_graph(d) も同様。
- ツリーなら、jg.tree_data(G, root)、jg.tree_graph(d)。
- 行列への変換では、nx.adjacency_matrix、nx.incidence_matrix も使える。
- グラフの形状をイミュータブルにするには、nx.freeze(G) を使う。