Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.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_Graph_Networkx - Fatal编程技术网

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

Python 基于分数矩阵的图的非边排序,python,graph,networkx,Python,Graph,Networkx,我想根据分数矩阵对非边进行排序,非边1-4的分数为0.6,2-5的分数为0.3,因此输出为[1-4,2-5] “编辑我的实际数据”是一个熊猫数据框(下面是我的实际数据集的一个玩具数据集示例),我正在将其转换为networkx图形对象 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(n

我想根据分数矩阵对非边进行排序,非边1-4的分数为0.6,2-5的分数为0.3,因此输出为[1-4,2-5]

“编辑我的实际数据”是一个熊猫数据框(下面是我的实际数据集的一个玩具数据集示例),我正在将其转换为networkx图形对象

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]])
分数矩阵采用矩阵5X5的形式,其中元素分数[1,4]表示节点1和4之间的边缘,其分数为0.6

编辑2-

从图1中,我们可以看到缺失边是1-4,2-3,2-5,3-4,3-5,3-5,3-5,它们各自的分数是0.6 0.6 0.3 0.4 0.3 0.7,因此我们根据分数对它们进行排序,因此最终输出是3-5 1-4 2-3-4 2-5 4-5

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

data1 = { 'node1': [1,1,1,2],
     'node2': [2,3,5,4],
     'weight': [1,1,1,1], }
df1 = pd.DataFrame(data1, columns = ['node1','node2','weight'])
编辑-

现在我知道您只关心排名边向量,不需要为边分配分数,无需调用第二个图即可完成。可以使用内置的sorted()函数并为键参数指定lambda函数。lambda查找每条边的分数值,并使用该值进行排序。由于首先需要高分数边,因此还必须指定reverse=True

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]

更多信息可能会有所帮助:1)您是否假设您的图形将有5个元素?2) 分数数组中的位置是否对应于图形的邻接矩阵?3) 我看不到分数数组中的任何地方有0.5——该值如何分配给任何边(或非边)?@请看上面的编辑器,其中一个是输出向量?由于您没有定义函数或提供所有代码,我不确定上面示例中的输出指的是什么。你能解释一下为什么上面例子的输出是[1-4,2-5]?从图1中我们可以看到缺失的边是1-4,2-3,2-5,3-4,3-5,3-5,它们各自的分数是0.6 0.6 0.3 0.4 0.3 0.7,所以我们根据分数对它们进行排序,所以最终的输出是3-5 1-4 2-3-4 2-4 2-5 4 4-4 4 4-4 4 4-4我更新了上面的答案。知道您只需要排名的边向量,而不需要将分数存储在图形中,这样做会更容易。
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)