1

大家。我正在使用 NetworkX 构建有向图并在其上迭代算法。在特定的迭代中,每个节点“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”的值也将被更新。

非常感谢您的帮助:)

4

1 回答 1

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() 的方式在图中完成所有这些操作(警告这不是一个好主意)

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

于 2016-01-17T16:32:13.963 回答