Networkx Python 边比较
Networkx Python Edges Comparison
我一直在尝试为一个项目构建一个图表,并且在用更多信息填充它之后,我一直在尝试识别新添加的边。
例如下面你可以看到它的第一次和第二次迭代:
-------------------- 一般信息图 H-------------------- ----------
Total number of Nodes in Graph: 2364
Total number of Edges: 3151
-------------------- 一般信息图 G ------------------ ----------
Total number of Nodes in Graph: 6035
Total number of Edges: 11245
我一直面临的问题是当我尝试使用代码识别新添加的边时:
counter = 0
edges_all = list(G.edges_iter(data=True))
edges_before = list(H.edges_iter(data=True))
print "How many edges in old graph: ", len(edges_before)
print "How many edges in new graph: ", len(edges_all)
edge_not_found = []
for edge in edges_all:
if edge in edges_before:
counter += 1
else:
edge_not_found.append(edge)
print "Edges found: ", counter
print "Not found: ", len(edge_not_found)
我得到了这些结果:
How many edges in old graph: 3151
How many edges in new graph: 11245
Edges found: 1601
Not found: 9644
我不明白为什么我找到的是 1601 而不是 11245-3151 = 8094
有什么想法吗?
谢谢!
TL/DR:对于您所看到的内容有一个简单的解释,如果您读到最后,编写代码的方法会更短(沿途有很多解释)。
首先请注意,Edges found
看起来像是 H
和 G
中的边数。所以它应该只有3151,而不是8094。8094应该是Not found
。请注意,找到的边数 1601 大约是您预期数量的一半。这是有道理的,因为:
我认为您遇到的问题是,当 networkx 列出边缘时,边缘可能在 edges_before
中显示为 (a,b)
。但是在 edges_after
中,它可能会在列表中显示为 (b,a)
。
所以 (b,a)
不会出现在 edges_before
中。它将无法通过您的测试。假设边缘顺序在 H
和 G
列出时不相关,您会发现其中大约一半通过。您可以进行不同的测试,看看 (b,a)
是否是 H
的边。这是H.has_edge(b,a)
一个简单的改进:
for edge in edges_all:
if H.has_edge(edge[0],edge[1]):
counter += 1
else:
edge_not_found.append(edge)
这让您甚至可以避免定义 edges_before
。
你也可以通过更好的改进来避免定义edges_all
:
for edge in G.edges_iter(data=True):
if H.has_edge(edge[0],edge[1]):
etc
注意:我将其写成 H.has_edge(edge[0],edge[1])
以明确发生了什么。更复杂的写法是 H.has_edge(*edge)
。 *edge
表示法 unpacks the tuple.
最后,使用 list comprehension 可以更好地获得 edge_not_found:
edge_not_found = [edge for edge in G.edges_iter(data=True) if not H.has_edge(*edge)]
这将创建一个由 edge
组成的列表,这些列表在 G
中但不在 H
中。
将所有这些放在一起(并使用 .size()
命令计算网络中的边数),我们得到一个更清晰的版本:
print "How many edges in old graph: ", H.size()
print "How many edges in new graph: ", G.size()
edge_not_found = [edge for edge in G.edges_iter(data=True) if not H.has_edge(*edge)]
print "Not found: ", len(edge_not_found)
print "Edges found: ", G.size()-len(edge_not_found)
我一直在尝试为一个项目构建一个图表,并且在用更多信息填充它之后,我一直在尝试识别新添加的边。
例如下面你可以看到它的第一次和第二次迭代:
-------------------- 一般信息图 H-------------------- ----------
Total number of Nodes in Graph: 2364
Total number of Edges: 3151
-------------------- 一般信息图 G ------------------ ----------
Total number of Nodes in Graph: 6035
Total number of Edges: 11245
我一直面临的问题是当我尝试使用代码识别新添加的边时:
counter = 0
edges_all = list(G.edges_iter(data=True))
edges_before = list(H.edges_iter(data=True))
print "How many edges in old graph: ", len(edges_before)
print "How many edges in new graph: ", len(edges_all)
edge_not_found = []
for edge in edges_all:
if edge in edges_before:
counter += 1
else:
edge_not_found.append(edge)
print "Edges found: ", counter
print "Not found: ", len(edge_not_found)
我得到了这些结果:
How many edges in old graph: 3151
How many edges in new graph: 11245
Edges found: 1601
Not found: 9644
我不明白为什么我找到的是 1601 而不是 11245-3151 = 8094
有什么想法吗?
谢谢!
TL/DR:对于您所看到的内容有一个简单的解释,如果您读到最后,编写代码的方法会更短(沿途有很多解释)。
首先请注意,Edges found
看起来像是 H
和 G
中的边数。所以它应该只有3151,而不是8094。8094应该是Not found
。请注意,找到的边数 1601 大约是您预期数量的一半。这是有道理的,因为:
我认为您遇到的问题是,当 networkx 列出边缘时,边缘可能在 edges_before
中显示为 (a,b)
。但是在 edges_after
中,它可能会在列表中显示为 (b,a)
。
所以 (b,a)
不会出现在 edges_before
中。它将无法通过您的测试。假设边缘顺序在 H
和 G
列出时不相关,您会发现其中大约一半通过。您可以进行不同的测试,看看 (b,a)
是否是 H
的边。这是H.has_edge(b,a)
一个简单的改进:
for edge in edges_all:
if H.has_edge(edge[0],edge[1]):
counter += 1
else:
edge_not_found.append(edge)
这让您甚至可以避免定义 edges_before
。
你也可以通过更好的改进来避免定义edges_all
:
for edge in G.edges_iter(data=True):
if H.has_edge(edge[0],edge[1]):
etc
注意:我将其写成 H.has_edge(edge[0],edge[1])
以明确发生了什么。更复杂的写法是 H.has_edge(*edge)
。 *edge
表示法 unpacks the tuple.
最后,使用 list comprehension 可以更好地获得 edge_not_found:
edge_not_found = [edge for edge in G.edges_iter(data=True) if not H.has_edge(*edge)]
这将创建一个由 edge
组成的列表,这些列表在 G
中但不在 H
中。
将所有这些放在一起(并使用 .size()
命令计算网络中的边数),我们得到一个更清晰的版本:
print "How many edges in old graph: ", H.size()
print "How many edges in new graph: ", G.size()
edge_not_found = [edge for edge in G.edges_iter(data=True) if not H.has_edge(*edge)]
print "Not found: ", len(edge_not_found)
print "Edges found: ", G.size()-len(edge_not_found)