大家。我正在使用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”的值也会更新。
非常感谢您的帮助:)
答案 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']也是需要评估的表达式。)
然后你有两个问题之一:
可以使用ast.literal_eval()之类的内容在图表中完成所有操作(警告这不是一个好主意)
如果您只有一个操作要执行(添加?),那么您可以使用一些技巧,例如保留数据位置的运行列表,然后执行求和()。