首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于分数矩阵的图的非边排序

基于分数矩阵的图的非边排序
EN

Stack Overflow用户
提问于 2017-12-01 16:22:16
回答 1查看 122关注 0票数 0
代码语言:javascript
运行
复制
import networkx as nx
import numpy as np
G = nx.MultiGraph()
G.add_edges_from([('1', '2'), ('1', '3'),('1','5'),('2','4')])
l= list(nx.non_edges(G))

score=np.array([[0.9,0.7,0.2,0.6,0.4],[0.7,0.9,0.6,0.8,0.3],[0.2,0.6,0.9,0.4,0.7],[0.6,0.8,0.4,0.9,0.3],[0.4,0.3,0.7,0.3,0.9]])

我想根据分数矩阵对非边进行排序,即非边1-4有0.6 ,2-5有0.3,所以输出是1-4,2-5。

编辑-我的实际数据是以熊猫数据的形式(下面是一个玩具数据集的例子,我的实际数据集),我正在转换为一个networkx图形对象。

代码语言:javascript
运行
复制
data1 = { 'node1': [1,1,1,2],
     'node2': [2,3,5,4],
     'weight': [1,1,1,1], }
df1 = pd.DataFrame(data1, columns = ['node1','node2','weight'])

得分矩阵的形式是矩阵5X5,其中元素评分1,4表示节点1和4之间的边缘,其得分为0.6。

社论2-

从图1可以看出,缺失的边是1-4, 2-3 , 2-5 , 3-4 , 3-5 ,3-5,3-5,3-5,3-5,分别是0.6,0.3,0.3,0.7,所以我们根据分数对它们进行排序,最终输出是3-5 1-4 -2-3-3-4-4-4- 4-5。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-01 17:30:32

尽管您可以使用nx.non_edges()找到图中缺少边缘的位置,但该函数实际上并不返回可以分配数据的对象--毕竟逻辑图中不存在非边。但是,您可以创建一个包含第一个图中的所有边的第二个图,然后将分数分配给第二个图中的边。

代码语言:javascript
运行
复制
import networkx as nx
import numpy as np


G1 = nx.MultiGraph()
G1.add_edges_from([
    ('1', '2'),
    ('1', '3'),
    ('1', '5'),
    ('2', '4')])

G2 = nx.MultiGraph()
G2.add_edges_from(nx.non_edges(G1))

score = np.array([
    [0.9, 0.7, 0.2, 0.6, 0.4],
    [0.7, 0.9, 0.6, 0.8, 0.3],
    [0.2, 0.6, 0.9, 0.4, 0.7],
    [0.6, 0.8, 0.4, 0.9, 0.3],
    [0.4, 0.3, 0.7, 0.3, 0.9]])

for u, v, d in G2.edges(data=True):
    i = int(u) - 1
    j = int(v) - 1
    d['score'] = score[i, j]

编辑-

现在我知道了,您只关心排列好的边缘向量,不需要将分数分配到边缘,就可以在不调用第二个图的情况下完成。您可以使用内置的排序()函数,并为键参数指定lambda函数。lambda查找每个边的得分值,并使用该值进行排序。因为你首先想要高分的边缘,所以你也必须指定reverse=True.

代码语言:javascript
运行
复制
import networkx as nx
import numpy as np


G = nx.MultiGraph()
G.add_edges_from([
    ('1', '2'),
    ('1', '3'),
    ('1', '5'),
    ('2', '4')])

score = np.array([
    [0.9, 0.7, 0.2, 0.6, 0.4],
    [0.7, 0.9, 0.6, 0.8, 0.3],
    [0.2, 0.6, 0.9, 0.4, 0.7],
    [0.6, 0.8, 0.4, 0.9, 0.3],
    [0.4, 0.3, 0.7, 0.3, 0.9]])

ranked_non_edges = sorted(
    nx.non_edges(G),
    key=lambda e: score[int(e[0])-1, int(e[1])-1],
    reverse=True)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47597418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档