auの日記

プログラミング初心者の日記。(auはハンドルネームです)

ScipyのバージョンによってはNetworkxで正常にグラフを作ることができなかった

auです。

ファイルを受け取り、その中身の隣接行列を作成するという問題がありました。その際に、意味不明なグラフができてしまったので、解決策を忘れないようにメモしておきたいと思います。



Networkxを用いてアルゴリズムの問題を解こうとした際に、Scipyモジュールが入っていないというエラーが出てしまったので、インストールしました。

この時、それぞれのモジュールのバージョンは

networkx==2.3
scipy==1.3.0 // DLした際の最新

そして、以下のファイルをnetworkxを利用して読み込み、隣接行列を作ってみる

//読み込むファイル
0 3
0 5
0 7
1 4
1 6
2 8
2 10
2 11
3 4
4 5
5 6
5 8
6 9
7 8
7 10
8 9
9 11
G = nx.read_edgelist('hogehoge', create_using=nx.DiGraph(), nodetype=int)
a = nx.adjacency_matrix(G, weight=None)
a = a.todense()
a = a.astype(float)

とし、出力してみると・・・

[0. 1. 1. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 1. 0. 1. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 1. 1. 0. 0.]
 [0. 0. 0. 0. 0. 1. 1. 0. 0. 0. 0. 0.]
 [0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
 [0. 0. 0. 0. 0. 0. 0. 0. 1. 1. 1. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]]

ん〜おかしい・・・教授や友人の力を借りて、以下のように修正すれば大丈夫と知りました。

n = nx.number_of_nodes(G)
a = nx.adjacency_matrix(G, nodelist=range(n), weight=None)

あとは上のコードと同様に、行列を作成して出力します。

[[0. 0. 0. 1. 0. 1. 0. 1. 0. 0. 0. 0.]
 [0. 0. 0. 0. 1. 0. 1. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 1. 1.]
 [0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 1. 0. 1. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 1. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]

思っていた通りのものが出力されました。


nodelistにGのノード数を指定することで解決できたのですが、正直なぜこうなるかは調べてみてもよくわかりませんでした・・・。分かる方がいらっしゃいましたら、ぜひコメントで教えていただきたいです。