为什么不使用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)])
期望和问题
edges
和ge
应该具有相同的长度- 为什么不呢?
edges
和ge
应该具有相同的节点组合- 为什么不呢?
- 我的期望不正确吗?如果是,为什么?
- [如果有的话,可以使
ge
和edges
匹配吗?
答案
这是因为您正在生成无向图,并且边缘列表中的某些边缘以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()?的主要内容,如果未能解决你的问题,请参考以下文章