有没有办法计算NetworkX中节点属性的总和

2024-07-05 14:46:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我拥有以下网络:

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)

enter image description here

将属性指定给每个节点后

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)

例如,上面的which返回,即:

[in]  max_att_sum(G, 'COMP1', 't)
[out] 9

9,因为'RAW1'(6)+'COMP1'(3)>;'图纸2'(4)+“组件1'(3)

有人知道如何解决这个问题吗


Tags: df属性attcomponentmaterialnodesnxfg
1条回答
网友
1楼 · 发布于 2024-07-05 14:46:06

我已经找到了解决办法。不过,如果您知道一个更有效的解决方案,我将非常感谢您的帮助

第一步。为每条边添加权重:

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']

第二步。用于计算最长路径的函数:

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]

相关问题 更多 >