NetworkX: how to add weights to an existing G.edges()?
给定在NetworkX中创建的任何图形G,我希望能够在创建图形后为G.edges()分配一些权重。 涉及的图形是网格,erdos-reyni,barabasi-albert等。
鉴于我的
1 | [(0, 1), (0, 10), (1, 11), (1, 2), (2, 3), (2, 12), ...] |
而我的
1 | {(0,1):1.0, (0,10):1.0, (1,2):1.0, (1,11):1.0, (2,3):1.0, (2,12):1.0, ...} |
如何为每个边缘分配相关权重? 在这种情况下,所有权重均为1。
我试图像这样直接将权重添加到G.edges()
1 2 | for i, edge in enumerate(G.edges()): G.edges[i]['weight']=weights[edge] |
但是我得到这个错误:
1 2 3 4 5 6 7 8 | --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-48-6119dc6b7af0> in <module>() 10 11 for i, edge in enumerate(G.edges()): ---> 12 G.edges[i]['weight']=weights[edge] TypeError: 'instancemethod' object has no attribute '__getitem__' |
怎么了? 由于
它失败,因为
该文档说要这样做:
1 | G[source][target]['weight'] = weight |
例如,以下内容对我有用:
1 2 3 4 5 6 7 8 9 10 | import networkx as nx G = nx.Graph() G.add_path([0, 1, 2, 3]) G[0][1]['weight'] = 3 >>> G.get_edge_data(0, 1) {'weight': 3} |
但是,您的代码类型确实失败了:
1 2 3 4 5 6 7 | G.edges[0][1]['weight'] = 3 --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-14-97b10ad2279a> in <module>() ----> 1 G.edges[0][1]['weight'] = 3 TypeError: 'instancemethod' object has no attribute '__getitem__' |
就您而言,我建议
1 2 | for e in G.edges(): G[e[0]][e[1]] = weights[e] |
添加这样的边:
g1.add_edge('Joseph', 'Michael', weight = 3)
g1.add_edge('Joseph', 'Jason', weight = 4)
然后检查图形是否加权:
True
blockquote>
blockquote>按权重的大小对权重进行分类:
1
2 elarge = [(u, v) for (u, v, d) in g1.edges(data=True) if d['weight'] > 4]
esmall = [(u, v) for (u, v, d) in g1.edges(data=True) if d['weight'] <= 4]接下来显示加权图:
1 pos = nx.spring_layout(g1) # positions for all nodes节点
1 nx.draw_networkx_nodes(g1, pos, node_size=100)边缘
1
2
3
4 nx.draw_networkx_edges(g1, pos, edgelist=elarge,
width=5)
nx.draw_networkx_edges(g1, pos, edgelist=esmall,
width=5, alpha=0.5, edge_color='g', style='dashed')