Python的Networkx,“自动”更新属性

时间:2016-01-12 19:49:13

标签: python attributes networkx automatic-updates

大家。我正在使用NetworkX构建DiGraph并在其上迭代算法。在特定的迭代中,每个节点“n”改变一个特定的属性,比如说“A_n”。现在,涉及这个特定节点“n”和给定前任“m”的每个边缘都有另一个感兴趣的属性,它取决于“A_n”,我们称之为“B_mn”。我的问题是:是否可以通过修改节点集中所有“n”,“m”的“A_n”来“自动”更新“B_mn”?我的意思是,不是迭代节点,而是遍历它们的前辈,但使用一种动态函数“B_mn(A_n)”,它在“A_n”改变的那一刻改变它的值。这可能吗?

我在考虑这样的事情:

设X和Y为数字,我们假设

G.node [“n”] [“A”] = X和G.edge [“m”] [“n”] [“B”] = Y + G.node [“n”] [“ A“]

我想通过改变X的值来改变边缘中属性“B”的值也会更新。

非常感谢您的帮助:)

1 个答案:

答案 0 :(得分:0)

这个问题的一个问题 - >不要删除节点。

在您的示例中,您将X分配给G.node [" n"] [" A"]。如果你说:

G.node["n"]["A"] = 5
G.node["n"]["A"] = 6

摧毁了数据位置,现在G.node [" n"] [" A"]指向具有新内存位置的新对象。

而不是像' ='你需要更新X.这将保留数据类型和内存位置。这意味着你需要一个支持" .update()"的数据类型。像字典一样。

此处的所有内容都取决于您的使用案例:

如果节点数据是一个值(如int或float),那么将它们添加到一起就不会有问题。您可以根据仅比正在执行的计算更深1级的更改的值添加来继续运行计算。

但是,如果节点数据是表达式的表达式......  例如G.node.get(' n')[' A'] + G.node.get(' m')[' A' ;](G.node.get(' m')[' A']也是需要评估的表达式。)

然后你有两个问题之一:

  • 您将需要一个执行评估OR
  • 的递归函数
  • 您需要在图表之外保留一个正在运行的字典列表,并在那里执行运行评估,这将更新图表中的数据值。

可以使用ast.literal_eval()之类的内容在图表中完成所有操作(警告这不是一个好主意)

如果您只有一个操作要执行(添加?),那么您可以使用一些技巧,例如保留数据位置的运行列表,然后执行求和()。

相关问题