【问题标题】:networkx edges return wrong indicesnetworkx 边缘返回错误的索引
【发布时间】:2019-10-03 17:10:16
【问题描述】:

我从几天开始使用 python 和 networkx。 我有一个无向图,我尝试迭代连接到节点的边。

我用过

print (G.edges)

for i in G.nodes:

    print( G.edges(i))

获得

[(0, 1), (0, 2), (0, 4), (1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]

[(0, 1), (0, 2), (0, 4)]

[(1, 0), (1, 2), (1, 3), (1, 4)]

[(2, 0), (2, 1), (2, 3), (2, 4)]

[(3, 1), (3, 2), (3, 4)]

[(4, 0), (4, 1), (4, 2), (4, 3)]

G.edges() 提供的边在某些情况下会颠倒两个节点(例如,对于 i=1,我有边 (1,0),但它不存在!!我只有 (0,1)。由于图是无方向的,它是同一条边,但是如果我尝试将它用作边向量的索引,它就不起作用了。

我试过了

for i in G. nodes
...   do something with .... x[e] for e in G.edges(i)

【问题讨论】:

  • 您的问题到底是什么?根据networkx docG.edges 删除了无向边的重复表示,而跨所有节点的邻居报告自然会报告两个方向。
  • 我的图没有方向。我将 G.edges() 返回的边存储在一个变量数组中(我正在编写一个数学模型)。用 G.edges(node) 检索边 我有两个节点的边,其中两个节点的顺序与 G.edges() 中的相反,因此它们不能用作我的变量的索引。示例: G.edges() = [(0,1), (0,2)] 和 G.edges(1) 返回 (1,0) !是否可以像 G.edges() 列表中那样具有两个节点(索引)的边缘?

标签: python networkx graph-theory


【解决方案1】:

您可以将G.edges() 的列表扩展为双向

a = [e for e in G.edges]

根据networkx Documentation,为您提供边列表[(0, 1), (0, 2), (0, 4), (1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)],它删除了无向边的重复表示,而跨所有节点的邻居报告自然会报告两个方向。

您可以:

1) 通过以相反的顺序添加边表示来复制列表

a = [e for e in G.edges] + [(y, x) for (x, y) in G.edges]

给你

[(0, 1), (0, 2), (0, 4), (1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4), (1, 0), (2, 0), (4, 0), (2, 1), (3, 1), (4, 1), (3, 2), (4, 2), (4, 3)]

或者; 2) 使用列表推导从 G.edges(i) 获取边缘,就像你做的那样:

b = [e for i in G.nodes for e in G.edges(i)]

输出:

[(0, 1), (0, 2), (0, 4), (1, 0), (1, 2), (1, 3), (1, 4), (2, 0), (2, 1), (2, 3), (2, 4), (3, 1), (3, 2), (3, 4), (4, 0), (4, 1), (4, 2), (4, 3)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-25
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 2018-04-16
    相关资源
    最近更新 更多