我在Python中使用networkx1.10进行一个项目,该项目需要将网络转储到硬盘上,然后重新加载它们,以便继续执行一些操作此类网络的算法。在
我试着用几种不同的方法来做:使用nx.写入()和nx_一开始读_gml(),现在使用pickle/cpickle。在
虽然表面上看起来一切都很好,但我注意到无论在某个时间点上是否发生了保存/加载,我在模拟中得到了不同的结果。在
我认为这可能与以下事实有关:某些网络似乎被转储/重新加载过程所修改(这当然是意外的)。在
为了调试,现在我用pickle保存并重新加载每个网络,比较它们的gml表示(用nx.写入/ nx.生成)倾倒/重新装载之前和之后。这么做,我注意到了一些差异。在
在某些情况下,它只是一些图形属性的顺序被修改,不会对我的程序造成损害。在其他情况下,两条边在gml表示中出现的顺序不同,同样没有坏处。在
但是,在某些节点中,ID经常被修改:
https://www.diffchecker.com/zvzxrshy
虽然边似乎被相应地修改,使得网络看起来是等效的,但是ID中的这种变化可以改变我的模拟(原因我不打算解释)。在
我相信这可能是我问题的根源。在
您知道为什么会发生这种情况吗?即使使用低级序列化机制(如pickle/cpickle实现的机制)?在
如何确保序列化过程前后的网络完全相同?在
我在做这样的事情:
with open('my_network.pickle', 'wb') as handle:
pickle.dump(my_network, handle, protocol=pickle.HIGHEST_PROTOCOL)
...
with open('my_network.pickle', 'rb') as handle:
my_network_reloaded = pickle.load(handle)
# compare nx.write_gml for my_network and my_network_reloaded
任何帮助都将得到高度赞赏:在过去的三天里,我一直在与这个问题斗争,我快疯了!在
谢谢你
它们似乎是相同的图,直到同构为止。在
您的问题可能是节点顺序。实际上,networkx使用dict来存储节点和边,这些节点和边是无序和随机的。在
有两种解决方案:要么忽略它,要么使用有序图:
(示例来自the documentation of the Graph class)
相关问题 更多 >
编程相关推荐