2017-06-25 49 views
1

私はPythonとnetworkxを使用してネットワークを作成しようとしています。任意の属性を持つNetworkX:新しいグラフに重みをコピーし、重みが重複する

1 2 34 
1 4 23 
1 5 25 
2 4 46 
2 5 90 
2 12 4 
... 

とノードデータ(例えば、色、種類、形状)、またTSV:

1 red cat round 
2 blue mouse round 
3 green rat triangle 
4 yellow trex square 

私が組み合わせたい私は、TSV(ノード、ノード、重量)としてエッジデータを持っていますこの情報を使用して1つのネットワークを作成します。これまでのところ、すべてが正常に動作します:

ここ
df = pd.read_csv('nodes.tsv', sep='\t') # using pandas to read 
for idy, row in df.iterrows(): 
    G2.add_node(row[0], color = row[1], type = row[2], shape = row[3]) 
... 
with open('edges.tsv','rb') as edges_file: 
    G = nx.read_weighted_edgelist(edges_file) 
... 
G2.add_weighted_edges_from(G.edges(data = True)) 

最後の行は問題です。

>>>print(str(G2.edges(data=True))[1:200]) 
[('1', '2', {'weight': {'weight': 34}}), ('1', '4', {'weight': {'weight': 23}}) 

どのように私は、これらの二重の '重み' を削除することができますか?これを行うより良い方法はありますか?

+0

各辞書については、dict ['weight'] = dict ['weight'] ['weight']と言っていますが、詳細についてはわかりませんが、それはいくつかのタプル操作で動作します。 – pointerless

答えて

0

nx.read_weighted_edgelistを使用しないでください。 nx.read_edgelistを使用すると、正しく読み取られるので、{'weight': 34}などしかありません。

また、edges.tsvの作成方法を制御できます。一般に、nx.read_weighted_edgelistnx.write_weighted_edgelistnx.read_edgelistとの組み合わせはnx.write_edgelistです。代わりにadd_weighted_edges_fromを使用しての

1

は、ある

G2.add_edges_from(G.edges(data = True)) 

は、コマンドからのweighted一部を削除しません。

G.edges(data=True)のタプルの3番目のエントリは、エッジのすべての属性を含む辞書です。 add_edges_fromは、エッジがフォーム(node1, node2, dict)に追加されていることからエッジに重み付けされていることを認識し、そのdictが属性のdictであることを認識します。

add_weighted_edges_fromを使用すると、入力が(node1, node2, weight)という形式になると予想されるため、問題が発生します。それで、それは、その重みがディクテーションの内容ではなく、全体のディクテーションであると解釈しています。

関連する問題