Python Networkx:保存/序列化网络到硬盘时保留节点ID



我在Python中使用networkx1.10来完成一个项目,该项目需要将网络转储到硬盘上,然后重新加载它们,以便继续执行一些操纵这些网络的算法。

我一直在尝试用几种不同的方式做到这一点:首先使用nx_write_gml()和nx_read_gml(),现在使用pickle/cpickle。

虽然表面上看起来一切都很好,但我注意到,在我的模拟中,无论保存/加载是否在某个时间点发生,我都会得到不同的结果。

我认为这可能与某些网络似乎被转储/重新加载过程修改(这当然是意料之外的)有关。

为了调试,现在我用pickle保存和重新加载每个网络,比较它们的gml表示(使用nx实现)。Write_gml/nx.generate_gml)转储/重新加载前后。这样做,我发现了一些差异。

在某些情况下,只是一些图属性的顺序被修改了,这对我的程序没有任何影响。在其他情况下,两条边在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使用字典来存储节点和边,这是无序和随机的。

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

>>> 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)]

(来自Graph类文档中的示例)

最新更新