Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找给定节点的最高权重边_Python_Python 2.7_Networkx - Fatal编程技术网

Python 查找给定节点的最高权重边

Python 查找给定节点的最高权重边,python,python-2.7,networkx,Python,Python 2.7,Networkx,我在NetworkX中有一个有向图。边缘从0到1加权,表示它们发生的概率。网络连通性非常高,所以我想修剪每个节点的边缘,这样就只剩下概率最高的节点 我不知道如何在每个节点上迭代,并在图中只保留边中权重最高的。是否有允许我们执行此操作的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

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

我不知道如何在每个节点上迭代,并在图中只保留边中权重最高的
。是否有允许我们执行此操作的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
如果一个节点中有两条边,并且它们都具有最高的权重,我希望保留它们。

以下是一些想法:

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启发的。我使用了以下代码:

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

由于以下原因,ericmjl提供的解决方案不完全适用于我的程序。 此外,如问题中所述,它以最低的概率保留边,而不是以最高的概率保留边(因为:删除权重>最小的所有边,而不是删除权重<最大的所有边)。此外,对len(edges)>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])
G.nodes()中节点的
:
边=G.边(节点,数据=真)
如果len(edges)>1:#某些节点的边数为零
max_weight=max([edge[2]['weight']表示边中的边])
对于列表中的边(边):
如果边[2][“重量”]<最大重量:
G.删除_边(边[0],边[1])

Aric,您的答案与我想要的非常接近,但您设置的阈值有问题。我不是在寻找高于某个阈值的东西(
weight>=0.9
)。您将看到B->C不包括在内,因为有一条边A->C的权重更高。相反,我要寻找进入给定节点的顶值边。也许我得修改一下这个问题,让它更清楚?再看看,你的回答给了我灵感,让我知道我需要做什么。我会马上发布我的解决方案,但在此期间,我会投票支持你的答案。