eri*_*mjl 5 python networkx python-2.7
我在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
Run Code Online (Sandbox Code Playgroud)
如果一个节点有两条边,并且它们都是最重的,我想保留它们.
以下是一些想法:
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'])
Run Code Online (Sandbox Code Playgroud)
我的解决方案受到了阿里克的启发.我使用了以下代码:
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])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6342 次 |
| 最近记录: |