找到给定节点的最高权重边缘

时间:2013-08-13 20:47:10

标签: python python-2.7 networkx

我在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

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

3 个答案:

答案 0 :(得分:8)

以下是一些想法:

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

答案 1 :(得分:7)

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

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

答案 2 :(得分:0)

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

完整的解决方案:

<ng-container *ngIf="loggedIn">
  <a title="Search" #searchAnchor (click)="toggleSearchPopup()">
    <icon [iconId]="'search'"></icon>
  </a>

  <kendo-popup #searchPopup
             [anchor]="searchAnchor"
             [anchorAlign]="anchorAlign"
             [popupAlign]="popupAlign"
             *ngIf="show">
    <!-- popup content... --> 
  </kendo-popup>
</ng-container>