Python Networkx保存/序类化网络到硬盘时保持节点ID

2024-04-25 14:16:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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

任何帮助都将得到高度赞赏:在过去的三天里,我一直在与这个问题斗争,我快疯了!在

谢谢你


Tags: 项目网络id序列化顺序过程my情况
1条回答
网友
1楼 · 发布于 2024-04-25 14:16:06

它们似乎是相同的图,直到同构为止。在

您的问题可能是节点顺序。实际上,networkx使用dict来存储节点和边,这些节点和边是无序和随机的。在

有两种解决方案:要么忽略它,要么使用有序图:

>>> class OrderedGraph(nx.Graph):
...    node_dict_factory = OrderedDict
...    adjlist_dict_factory = OrderedDict
>>> G = OrderedGraph()
>>> G.add_nodes_from( (2,1) )
>>> G.nodes()
[2, 1]
>>> G.add_edges_from( ((2,2), (2,1), (1,1)) )
>>> G.edges()
[(2, 2), (2, 1), (1, 1)]

(示例来自the documentation of the Graph class

相关问题 更多 >

    热门问题