有什么方法可以计算 NetworkX 中节点属性的总和
Is there any way to calculate sum of node attributes in NetworkX
我有以下网络:
df = pd.DataFrame([
{'Material': 'FG', 'Component': 'COMP1'},
{'Material': 'FG', 'Component': 'COMP2'},
{'Material': 'COMP1', 'Component': 'RAW1'},
{'Material': 'COMP1', 'Component': 'RAW2'},
{'Material': 'COMP2', 'Component': 'RAW3'},
{'Material': 'COMP3', 'Component': 'RAW4'}
])
G = nx.from_pandas_edgelist(df, source='Material', target='Component', create_using=nx.DiGraph)
为每个节点分配一个属性后
G.nodes['FG']['t'] = 2
G.nodes['COMP1']['t'] = 3
G.nodes['COMP2']['t'] = 5
G.nodes['COMP3']['t'] = 1
G.nodes['RAW1']['t'] = 6
G.nodes['RAW2']['t'] = 4
G.nodes['RAW3']['t'] = 1
G.nodes['RAW4']['t'] = 8
我想计算所选节点后代的属性 't' 的最大总和。也就是说,写一个函数:
max_att_sum(G, node, att)
上面的例子 returns,即:
[in] max_att_sum(G, 'COMP1', 't)
[out] 9
9,因为'RAW1'(6)+'COMP1'(3)>'RAW2'(4)+'COMP1'(3)
有人知道如何解决这个问题吗?
我已经找到了解决办法。但是,如果您知道更有效的解决方案,我将不胜感激。
第 1 步。为每条边添加权重:
for e in nx.edges(G):
if nx.descendants(G, e[1]):
G[e[0]][e[1]]['weight'] = G.nodes[e[0]]['t']
else:
G[e[0]][e[1]]['weight'] = G.nodes[e[0]]['t'] + G.nodes[e[1]]['t']
第2步.计算最长路径的函数:
def max_att_sum(G, node, attr):
if nx.descendants(G, node):
return nx.dag_longest_path_length(G.subgraph(nx.descendants(G, node) | set([node])))
else:
return G.nodes[node][attr]
我有以下网络:
df = pd.DataFrame([
{'Material': 'FG', 'Component': 'COMP1'},
{'Material': 'FG', 'Component': 'COMP2'},
{'Material': 'COMP1', 'Component': 'RAW1'},
{'Material': 'COMP1', 'Component': 'RAW2'},
{'Material': 'COMP2', 'Component': 'RAW3'},
{'Material': 'COMP3', 'Component': 'RAW4'}
])
G = nx.from_pandas_edgelist(df, source='Material', target='Component', create_using=nx.DiGraph)
为每个节点分配一个属性后
G.nodes['FG']['t'] = 2
G.nodes['COMP1']['t'] = 3
G.nodes['COMP2']['t'] = 5
G.nodes['COMP3']['t'] = 1
G.nodes['RAW1']['t'] = 6
G.nodes['RAW2']['t'] = 4
G.nodes['RAW3']['t'] = 1
G.nodes['RAW4']['t'] = 8
我想计算所选节点后代的属性 't' 的最大总和。也就是说,写一个函数:
max_att_sum(G, node, att)
上面的例子 returns,即:
[in] max_att_sum(G, 'COMP1', 't)
[out] 9
9,因为'RAW1'(6)+'COMP1'(3)>'RAW2'(4)+'COMP1'(3)
有人知道如何解决这个问题吗?
我已经找到了解决办法。但是,如果您知道更有效的解决方案,我将不胜感激。
第 1 步。为每条边添加权重:
for e in nx.edges(G):
if nx.descendants(G, e[1]):
G[e[0]][e[1]]['weight'] = G.nodes[e[0]]['t']
else:
G[e[0]][e[1]]['weight'] = G.nodes[e[0]]['t'] + G.nodes[e[1]]['t']
第2步.计算最长路径的函数:
def max_att_sum(G, node, attr):
if nx.descendants(G, node):
return nx.dag_longest_path_length(G.subgraph(nx.descendants(G, node) | set([node])))
else:
return G.nodes[node][attr]