Python 的 Networkx,正在更新属性 "automatically"

Python's Networkx, updating attributes "automatically"

各位。我正在使用 NetworkX 构建有向图并在其上迭代算法。在特定的迭代中,每个节点 "n" 更改特定属性,比方说 "A_n"。现在,与这个特定节点 "n" 和给定前任节点 "m" 有关的每条边都有另一个感兴趣的属性,它取决于 "A_n",我们称它为 "B_mn"。我的问题是:是否可以通过修改节点集中所有 "n"、"m" 的 "A_n" 来更新 "B_mn" "automatically"?我的意思是,不是遍历节点,然后遍历它们的前辈,而是使用一种动态函数 "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" 的值也会更新。

非常感谢您的帮助:)

这个问题有一个问题->永远不要删除节点。

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

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

那个 destroy 的数据位置,现在 G.node["n"]["A"] 指向一个具有新内存位置的新对象。

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

这里的一切都取决于您的用例:


如果节点数据是一个值(如 int 或 float),那么将它们相加没有问题。您可以将 运行 基于变化的增值的计算保持在比正在执行的计算深 1 级。

但是如果节点数据是表达式的表达式... 例如 G.node.get('n')['A']+ G.node.get('m')['A'](其中 [=48= .get('m')['A']也是需要求值的表达式。)

那么你有两个问题之一:

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

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

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