【发布时间】:2015-11-02 12:40:09
【问题描述】:
我想使用 networkx 库比较两个图表。 我想尝试包含 3 个节点的硬编码示例。其中一张图被引用,所以我想检查第二张图的边缘是否在同一个地方。我在考虑一个简单的算法,它会从给定的图中减去参考图,如果结果不是空图,那么它返回 false。
我的代码如下,但它不起作用:
import networkx as nx
import matplotlib.pyplot as plt
S=nx.DiGraph()#S-sample graph
S.add_nodes_from([0,1,2])
S.add_edge(0,2)
S.add_edge(1,2)
nx.draw(S)
#plt.savefig("S.png")
#plt.show()
R=nx.DiGraph()#R-reference graph
R.add_nodes_from([0,1,2])
R.add_edge(1,2)
nx.draw(R)
#plt.savefig("R.png")
#plt.show()
def difference(S, R):
DIF=nx.create_empty_copy(R)
DIF.name="Difference of (%s and %s)"%(S.name, R.name)
if set(S)!=set(R):
raise nx.NetworkXError("Node sets of graphs is not equal")
# if S.is_multipgraph():
# edges=S.edges_iter(keys=True)
# else:
edges=S.edges_iter()
for e in edges:
if not R.has_edge(*e):
DIF.add_edge(*e)
return DIF
D=difference(S, R)
plt.show(D)
【问题讨论】:
-
如果你想比较边缘,为什么不使用
if set(S.edges())!=set(R.edges())? -
我可以这样做,但我仍然必须指出有什么区别
-
将差异中的边添加到您的新有向图?
for e in set(S.edges()).difference(set(R.edges()): DIF.add_edge(e) -
注意 - 如果图表是无向的,请注意
set(S.edges())。我不确定您是否可以 100% 肯定边缘不会在一个图中返回为 1,2 而在另一个图中返回为 2,1。由于您的图表是定向的,因此这里不是问题。 -
@WardC 为什么不回答这个问题? (请添加关于无向图的警告)