在不同的图表上使用来自多个进程的NetworkX是否存在问题?

时间:2013-04-30 13:00:17

标签: networkx

如果每个进程都创建了自己的nx.Graph()并添加/删除了节点/边缘,那么它们是否有任何冲突的原因?我注意到一些奇怪的现象,并试图调试它们。

一般问题是我将一个图表作为边缘列表转储,并将其从每个进程中的子集重新创建为一个新图形。由于某种原因,这些新图表缺少边缘。

修改

我认为我找到了导致问题的部分代码,问题是以下是否是NetworkX的预期行为:

>>> import networkx as nx
>>> g = nx.Graph()
>>> g.add_path([0,1,2,3])
>>> g.nodes()
[0, 1, 2, 3]
>>> g.edges()
[(0, 1), (1, 2), (2, 3)]
>>> g[1][0]
{}
>>> g[0][1] = {"test":1}
>>> g.edges(data=True)
[(0, 1, {'test': 1}), (1, 2, {}), (2, 3, {})]
>>> g[1][0]
{}
>>> g[0][1]
{'test': 1}
>>>

由于图是一个非定向图,我希望边缘数据不管请求中的节点id都出现,这是不正确的假设吗?

1 个答案:

答案 0 :(得分:0)

一般情况下,只要每个进程都有自己的Graph()对象,就不会出现问题。

编辑:

在您的情况下,您使用行

明确地将数据分配给内部NetworkX Graph结构
>>> g[0][1] = {"test":1}

虽然技术上允许它破坏了API和数据结构。你应该改为使用

>>> g.add_edge(0,1,test=1)

这里不会添加新边,只有新属性。这样做可以正确地将数据分配给g [0] [1]和g [1] [0]。