NetworkX:图的修改与恢复
我有一个多重图,里面有很多节点和边。我随机删除了一些节点,然后计算删除后图的全球效率(GE)。
我想一次性删除一批节点,每次都测试一下全球效率,并生成一个文件,记录删除的节点数量和相应的全球效率,比如:
5% removed GE: 1
10% removed GE: 0.4
15% removed GE: 0.34
...
实际上,我希望在每次删除节点之前,把图恢复到原来的状态。这是因为节点的删除是随机的。所以,当我删除了5%的节点并测试了全球效率后,我希望图恢复,然后再随机删除10%的节点,这可能会包含之前删除的那5%。
我的尝试:
我试着创建一个全局变量来保存我的原始图。
MG = nx.multigraph # load MG with the nodes and edges
global originalgraph
originalgraph = MG
# conduct removal of 5% using MG
# . . .
# . . .
MG = originalgraph
# conduct removal of 10% using MG
# . . .
结果:
第一次操作很成功,删除了5%的节点。第二次操作似乎没有把多重图恢复到原来的状态。
有没有办法全局保存一个NetworkX图?
1 个回答
0
把图存储在一个共同的地方,叫做 original_graph
,然后使用 deepcopy()
来创建一个原始图的副本,这样就可以在副本上进行进一步的测试,而不会影响到原始图。
original_graph = nx.multigraph # load MG with the nodes and edges
global original_graph # <--- I do not know why you need this unless you are accessing the original_graph from inside a function.
MG = original_graph.deepcopy()
# conduct removal of 5% using MG
# . . .
# . . .
MG = original_graph.deepcopy()
# conduct removal of 10% using MG
# . . .
# . . .
你之前的方法有个问题,就是 MG
和 original_graph
都指向了同一个图对象。所以当你对图进行修改时,实际上是修改了唯一的那个图对象,这样就无法回到未修改的状态,因为只有一个图对象,而多个变量都在指向它。
现在,当你使用 deepcopy()
的时候,你实际上是创建了一个和 original_graph
指向的图对象一模一样的副本,并把这个新创建的对象的引用赋值给 MG
,然后你可以在这个副本上进行操作。接着,如果你再执行一次 deepcopy()
,就可以再创建一个 original_graph
的副本,并把它的引用存储在 MG
中,这样就可以进行更多的测试,而不会修改 original_graph
的内容。
希望这对你有帮助。