NetworkX:将权重复制到新图表,权重重复

时间:2017-06-25 16:12:02

标签: python python-3.x graph networkx

我正在尝试使用Python和networkx创建网络。我将边数据作为tsv(节点,节点,权重):

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

我想结合这些信息来创建一个网络。到目前为止,一切正常:

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}})

如何删除这些双重'权重'?有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

不使用add_weighted_edges_from,而是

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

即,从命令中删除weighted部分。

G.edges(data=True)中任何元组的第三个条目是包含边的所有属性的dict。 add_edges_from会发现边缘是按照(node1, node2, dict)形式添加边的事实加权的,并且会发现dict是属性的字典。

使用add_weighted_edges_from会导致问题,因为它希望输入的格式为(node1, node2, weight)。因此,它将权重解释为整个字典,而不是字典的内容。

答案 1 :(得分:0)

不要使用nx.read_weighted_edgelist。使用nx.read_edgelist会正确阅读,因此您只有{'weight': 34}等等。

或者,您可以控制edges.tsv的创建方式。一般情况下,将nx.read_weighted_edgelistnx.write_weighted_edgelistnx.read_edgelistnx.write_edgelist配对。