2017-11-09 3 views
0

のグラフを作成するためにファイルを解析:私はこのような形式のファイル(その大きなファイル)を持つパイソン

13 16 1 
11 17 1 
8 18 -1 
11 19 1 
11 20 -1 
11 21 1 
11 22 1 

最初の列は、開始頂点であり、2番目の列は終了頂点であります3番目は開始点と終了点の間の重みです。私はこのエラーを得networkxが、イムでグラフを作成しよう

"Edge tuple %s must be a 2-tuple or 3-tuple." % (e,)) 

ここでは私のコードです:

import networkx as nx 

file = open("network.txt","r") 
lines = file.readlines() 
start_vertex = [] 
end_vertex = [] 
sign = [] 

for x in lines: 
    start_vertex.append(x.split('\t')[0]) 
    end_vertex.append(x.split('\t')[1]) 
    sign.append(x.split('\t')[2]) 
file.close() 

G = nx.Graph() 

for i in lines: 
    G.add_nodes_from(start_vertex) 
    G.add_nodes_from(end_vertex) 
    G.add_edges_from([start_vertex, end_vertex, sign]) 

答えて

2

あなたがnetworkxのread_edgelistコマンドを使用する必要があります。

G=nx.read_edgelist('network.txt', delimiter = ' ', nodetype = int, data = (('weight', int),)) 

これはあなたの入力ファイルで使用してきた何のように見えるので、私が使用している区切り文字は、二つの空間であることに注意してください。


あなたのコードに固執する場合:

まず、for i in linesを取り除きます。

エラーの理由は2つあります。まず、G.add_edges_fromではなくG.add_weighted_edges_fromを使用します。

また、エントリの形式が(u、v、weight)のリスト(または同様のオブジェクト)が必要です。たとえば、G.add_weighted_edges_from([(13,16,1), (11,17,1)])は最初の2つのエッジを追加します。コマンドG.add_weighted_edges_from([[13,11,8,11,...],[16,17,18,19,...],[1,1,-1,1,...])が表示され、[13,11,8,11,...]が最初のエッジの情報である必要があり、[16,17,18,19,...]が2番目のエッジであり、[1,1,-1,1,...]が3番目のエッジであると考えます。これはできません。

G.add_weighted_edges_from(zip(start_vertex,end_vertex,sign))とすることができます。 zipのこの説明を参照してください。https://stackoverflow.com/a/13704903/2966723


最後に、 G.add_nodes_from(start_vertex)G.add_nodes_from(end_vertex)は不要です。 networkxがエッジを追加しようとしたときにノードがすでに存在しない場合は、ノードも追加されます。

1

pythonのnetworkxライブラリを使用します(私はPython 3.6と仮定しています)。

次のコードは、そのままあなたのファイルを表示します。上に書いた線は必要ありません。
私が書いたprintコマンドは、読み込まれたグラフが正しいかどうかを確認するのに役立ちます。

注:グラフが有向グラフでない場合は、関数に記述されているcreate_using=nx.DiGraph()部分を削除できます。

 
import networkx as nx 
g = nx.read_edgelist('network.txt', nodetype=int, data=(('weight', int),), create_using=nx.DiGraph(),delimiter=' ') 
print(nx.info(g)) 
関連する問題