NetworkX:如何向现有的 G.edges() 添加权重?

问题描述 投票:0回答:3

给定在 NetworkX 中创建的任何图 G,我希望能够在创建图之后为 G.edges() 分配一些权重。涉及的图有网格、erdos-reyni、barabasi-albert 等。 鉴于我的

G.edges()


[(0, 1), (0, 10), (1, 11), (1, 2), (2, 3), (2, 12), ...]

还有我的
weights


{(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()

for i, edge in enumerate(G.edges()): G.edges[i]['weight']=weights[edge]

但我收到此错误:

--------------------------------------------------------------------------- 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__'

出了什么问题?

既然G.edges()是一个列表,为什么我不能像其他列表一样访问它的元素?

    

python algorithm graph networkx edges
3个回答
18
投票
edges

是一个方法。

文档

说要这样做: G[source][target]['weight'] = weight

例如,以下内容对我有用:

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}

但是,你的代码类型确实失败了:

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__'

对于你的情况,我建议

for e in G.edges(): G[e[0], e[1]] = weights[e]



8
投票
文档

您可以使用
    将所有边权重一次设置为相同的值
  • nx.set_edge_attributes(G, values = 1, name = 'weight')
给定一个字典,其中的键对应于边缘元组(你的
    weights
  • ), 您可以使用
     将边权重分配给该字典中的值
    
  • nx.set_edge_attributes(G, values = weights, name = 'weight')
查看并验证这些边缘属性是否已设置
  • G.edges(data = True)


1
投票

g1.add_edge('Mark', 'Edward', weight = 3) g1.add_edge('Joseph', 'Michael', weight = 3) g1.add_edge('Joseph', 'Jason', weight = 4)


然后检查图表是否加权:

nx.is_weighted(g1)


正确

按重量大小对权重进行分类:

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]

接下来显示加权图:

pos = nx.spring_layout(g1) # positions for all nodes

节点

nx.draw_networkx_nodes(g1, pos, node_size=100)

边缘

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

© www.soinside.com 2019 - 2024. All rights reserved.