为什么不使用G.add_edges_from()添加边缘,匹配G.edges()?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么不使用G.add_edges_from()添加边缘,匹配G.edges()?相关的知识,希望对你有一定的参考价值。

场景

  • 使用networkx
  • 给出一个空图G
  • 将名为edges的元组列表添加到G
    • len(edges)是119
  • [G.edges()edges不匹配
    • [len(G.edges())是112,但我希望是119
    • 节点组合不匹配edges,但是我期望它们应该匹配

代码

import networkx as nx

edges = [(1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9), (1, 10), (1, 11), (1, 12), (1, 13), (1, 14), (1, 15), (1, 16), (1, 17), (1, 18), (1, 19), (1, 20), (1, 21), (1, 22), (1, 23), (1, 24), (1, 25), (1, 26), (1, 27), (1, 28), (1, 29), (1, 30), (1, 31), (1, 32), (1, 33), (1, 34), (1, 35), (1, 36), (1, 37), (1, 38), (1, 39), (1, 40), (1, 41), (1, 42), (1, 43), (1, 44), (1, 45), (1, 46), (1, 47), (1, 48), (1, 49), (16, 18), (16, 35), (16, 36), (16, 48), (18, 16), (18, 24), (18, 35), (18, 36), (19, 5), (19, 8), (19, 11), (19, 13), (19, 15), (19, 17), (19, 20), (19, 21), (19, 24), (19, 30), (19, 31), (19, 35), (19, 36), (19, 37), (19, 48), (28, 1), (28, 5), (28, 7), (28, 8), (28, 11), (28, 14), (28, 15), (28, 17), (28, 20), (28, 21), (28, 24), (28, 25), (28, 27), (28, 29), (28, 30), (28, 31), (28, 35), (28, 36), (28, 37), (28, 44), (28, 48), (28, 49), (36, 5), (36, 24), (36, 35), (36, 37), (37, 24), (37, 35), (37, 36), (39, 1), (39, 24), (39, 33), (39, 35), (39, 36), (39, 38), (39, 40), (39, 41), (39, 45), (42, 1), (43, 24), (43, 29), (43, 35), (43, 36), (43, 37), (43, 47), (43, 48), (45, 1), (45, 39), (45, 41)]

print(len(edges))
>>> 119

# unique index 0 values from each edges tuple
print(set([x[0] for x in edges]))
>>> {1, 16, 18, 19, 28, 36, 37, 39, 42, 43, 45}

# create empty graph
G = nx.Graph()

# add edges
G.add_edges_from(edges)

# get graph edges
ge = G.edges()

# length of ge
print(len(ge))
>>> 112

# unique index 0 values from each ge tuple
print(set([x[0] for x in ge]))
>>>{1, 5, 7, 8, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 24, 25, 27, 28, 29, 33, 35, 36, 37, 38, 39, 41, 43}

# output the edges of G
print(ge)
>>> EdgeView([(1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9), (1, 10), (1, 11), (1, 12), (1, 13), (1, 14), (1, 15), (1, 16), (1, 17), (1, 18), (1, 19), (1, 20), (1, 21), (1, 22), (1, 23), (1, 24), (1, 25), (1, 26), (1, 27), (1, 28), (1, 29), (1, 30), (1, 31), (1, 32), (1, 33), (1, 34), (1, 35), (1, 36), (1, 37), (1, 38), (1, 39), (1, 40), (1, 41), (1, 42), (1, 43), (1, 44), (1, 45), (1, 46), (1, 47), (1, 48), (1, 49), (5, 19), (5, 28), (5, 36), (7, 28), (8, 19), (8, 28), (11, 19), (11, 28), (13, 19), (14, 28), (15, 19), (15, 28), (16, 18), (16, 35), (16, 36), (16, 48), (17, 19), (17, 28), (18, 24), (18, 35), (18, 36), (19, 20), (19, 21), (19, 24), (19, 30), (19, 31), (19, 35), (19, 36), (19, 37), (19, 48), (20, 28), (21, 28), (24, 28), (24, 36), (24, 37), (24, 39), (24, 43), (25, 28), (27, 28), (28, 29), (28, 30), (28, 31), (28, 35), (28, 36), (28, 37), (28, 44), (28, 48), (28, 49), (29, 43), (33, 39), (35, 36), (35, 37), (35, 39), (35, 43), (36, 37), (36, 39), (36, 43), (37, 43), (38, 39), (39, 40), (39, 41), (39, 45), (41, 45), (43, 47), (43, 48)])

期望和问题

  1. edgesge应该具有相同的长度
    • 为什么不呢?
  2. edgesge应该具有相同的节点组合
    • 为什么不呢?
  3. 我的期望不正确吗?如果是,为什么?
  4. [如果有的话,可以使geedges匹配吗?
答案

这是因为您正在生成无向图,并且边缘列表中的某些边缘以reversed顺序相同。您可以通过对子列表进行排序并从结果中构建set来进行检查:

len(set(tuple(sorted(i)) for i in edges))
# 112

您可以看到,与图中的边具有相同数量的唯一组合节点。

如果您生成了directed graph,则会如预期的那样获得结果,因为在这种情况下,顺序[[does很重要:

G = nx.DiGraph() G.add_edges_from(edges) len(G.edges()) # 119

以上是关于为什么不使用G.add_edges_from()添加边缘,匹配G.edges()?的主要内容,如果未能解决你的问题,请参考以下文章

深度学习中合作网络

深度学习中合作网络

如何在列表中进行字符串格式化?

微信小程序怎么写代码,试了几次都是错误,不会写,不知道怎么添加代

怎么在dataGridView中不连接数据库添列的值

如果所有表都不存在,请添加一列?