NetworkX:如何向现有 G.edges() 添加权重?
NetworkX: how to add weights to an existing G.edges()?
给定在 NetworkX 中创建的任何图 G,我希望能够在创建图 之后将一些权重分配给 G.edges() 。涉及的图有grids、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()
是一个列表,为什么我不能像访问任何其他列表一样访问它的元素?
它失败了,因为 edges
是一个方法。
documentation 说要这样做:
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]
像这样添加边:
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)
True
按大小对权重进行分类:
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')
来自docs:
- 您可以使用
一次将所有边权重设置为相同的值
nx.set_edge_attributes(G, values = 1, name = 'weight')
- 给定一个字典,其中的键对应于边元组(你的
weights
),
您可以使用 将边权重分配给该字典中的值
nx.set_edge_attributes(G, values = weights, name = 'weight')
- 查看并验证这些边缘属性是否已设置
G.edges(data = True)
给定在 NetworkX 中创建的任何图 G,我希望能够在创建图 之后将一些权重分配给 G.edges() 。涉及的图有grids、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()
是一个列表,为什么我不能像访问任何其他列表一样访问它的元素?
它失败了,因为 edges
是一个方法。
documentation 说要这样做:
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]
像这样添加边:
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)
True
按大小对权重进行分类:
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')
来自docs:
- 您可以使用 一次将所有边权重设置为相同的值
nx.set_edge_attributes(G, values = 1, name = 'weight')
- 给定一个字典,其中的键对应于边元组(你的
weights
), 您可以使用 将边权重分配给该字典中的值
nx.set_edge_attributes(G, values = weights, name = 'weight')
- 查看并验证这些边缘属性是否已设置
G.edges(data = True)