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()。
各位。我正在使用 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()。