给定在 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() 是一个列表,为什么我不能像访问任何其他列表一样访问它的元素?

最佳答案

它失败,因为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]

关于python - NetworkX:如何为现有的 G.edges() 添加权重?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40128692/

10-12 16:56