【问题标题】:Find highest weight edge(s) for a given node查找给定节点的最高权重边
【发布时间】:2013-08-15 15:35:56
【问题描述】:

我在 NetworkX 中有一个有向图。边的权重从 0 到 1,表示它们发生的概率。网络连通性非常高,所以我想为每个节点修剪边缘,只保留概率最高的节点。

我不确定如何遍历每个节点并在图中仅保留最高权重的in_edges。是否有允许我们这样做的 networkx 功能?

这是我想做的一个例子。

Nodes:
A, B, C, D

Edges:
A->B, weight=1.0
A->C, weight=1.0
A->D, weight=0.5
B->C, weight=0.9
B->D, weight=0.8
C->D, weight=0.9

Final Result Wanted:
A->B, weight=1.0
A->C, weight=1.0
C->D, weight=0.9

如果一个节点有两条边,并且它们的权重都最高,我想保留它们。

【问题讨论】:

    标签: python python-2.7 networkx


    【解决方案1】:

    这里有一些想法:

    import networkx as nx
    
    G = nx.DiGraph()
    G.add_edge('A','B', weight=1.0)
    G.add_edge('A','C', weight=1.0)
    G.add_edge('A','D', weight=0.5)
    G.add_edge('B','C', weight=0.9)
    G.add_edge('B','D', weight=0.8)
    G.add_edge('C','D', weight=0.9)
    
    print "all edges"
    print G.edges(data=True)
    
    print "edges >= 0.9"
    print [(u,v,d) for (u,v,d) in G.edges(data=True) if d['weight'] >= 0.9]
    
    print "sorted by weight"
    print sorted(G.edges(data=True), key=lambda (source,target,data): data['weight'])
    

    【讨论】:

    • Aric,您的答案与我正在寻找的答案非常接近,但您设置的阈值有问题。我不是在寻找超过某个阈值 (weight >=0.9) 的东西。您会看到 B->C 不包括在内,因为有一条边 A->C 的权重更高。相反,我正在寻找进入给定节点的最高价值边。也许我必须编辑问题以使其更清楚?
    • 再看一遍,您的回答为我提供了我需要做的事情的灵感。我稍后会发布我的解决方案,但与此同时,我会对你的答案进行投票。
    【解决方案2】:

    我的解决方案受到 Aric 的启发。我使用了以下代码:

    for node in G.nodes():
        edges = G.in_edges(node, data=True)
        if len(edges) > 0: #some nodes have zero edges going into it
            min_weight = min([edge[2]['weight'] for edge in edges])
            for edge in edges:
                if edge[2]['weight'] > min_weight:
                    G.remove_edge(edge[0], edge[1])
    

    【讨论】:

      【解决方案3】:

      由于以下Runtime Error,提供的 ericmjl 解决方案在我的程序中无法完全运行。 此外,它保留了概率最低的边缘,而不是最高的边缘,正如问题中所问的那样(因为:删除所有权重 > min 的边,而不是删除所有权重 1 进行内循环就足够了,因为我们希望从具有多条边的节点中删除所有边。

      完整的解决方案:

      for node in G.nodes():
          edges = G.edges(node, data=True)
          if len(edges) > 1:  # some nodes have zero edges going into it
              max_weight = max([edge[2]['weight'] for edge in edges])
      
              for edge in list(edges):
                  if edge[2]['weight'] < max_weight:
                      G.remove_edge(edge[0], edge[1])
      

      【讨论】:

        猜你喜欢
        • 2022-11-17
        • 1970-01-01
        • 2016-02-23
        • 1970-01-01
        • 2017-09-21
        • 1970-01-01
        • 1970-01-01
        • 2020-12-28
        • 1970-01-01
        相关资源
        最近更新 更多