2017-12-01 7 views
0
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]]) 

는 I 2-5 정도로 출력이 [것 0.3 점을 가지며, 0.6의 점수 않은 비 에지 1-4 인 스코어 행렬에 기초하여 상기 비 에지 순위 할 1-4,2-5]순위 비 에지

편집 - 내 실제 데이터는 pandas 데이터 프레임 (아래 실제 데이터 세트의 장난감 데이터 세트 예제입니다.)을 networkx 그래프 객체로 변환합니다.

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

스코어 행렬 요소 스코어 [1,4] 0.6

edit2-
의 점수를 갖는 노드 (1) 및 (4) 사이의 경계를 나타내는 매트릭스 5X5 형태 인 그래프 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 3-4 2-5 4-5

+0

자세한 정보가 도움이 될 것입니다. 1) 그래프에 5 개의 요소가 있다고 가정합니까? 2) 점수 배열의 위치가 그래프의 인접 행렬과 일치합니까? 3) 스코어 배열에서 0.5가 보이지 않습니다 - 어떻게 그 값을 어떤 엣지 (또는 엣지가 아닌)에 할당 할 수 있습니까? – Apollo2020

+0

@ apollo2020 위의 편집 내용을 참조하십시오. –

답변

1

nx.non_edges()를 사용하여 그래프에서 모서리가없는 부분을 찾을 수 있지만, , 그 함수는 ctually 데이터를 할당 할 수있는 객체를 반환합니다 - 논리적 인 엣지에는 비 엣지가 존재하지 않습니다. 그러나 첫 번째 그래프에없는 모든 가장자리를 포함하는 두 번째 그래프를 만든 다음 두 번째 그래프의 가장자리에 점수를 할당 할 수 있습니다.

편집 -

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] 

는 지금은 그냥 위 가장자리 벡터 신경과 두 번째 그래프를 호출하지 않고 수행 할 수 있습니다 가장자리에 점수를 할당 할 필요가 없습니다 알고. 내장 sorted() 함수를 사용하고 key 인수에 대해 람다 함수를 지정할 수 있습니다. 람다는 각 모서리의 점수 값을 조회하고 그 값을 정렬에 사용합니다. high-score edge를 원하기 때문에 reverse = True를 지정해야합니다.

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) 
+0

어느 것이 출력 벡터입니까? –

+0

함수를 정의하지 않거나 모든 코드를 제공하지 않으므로 위에 나와있는 예제의 결과가 무엇을 의미하는지 확신 할 수 없습니다. 위의 예에서 얻은 결과가 [1-4, 2-5] 인 이유를 설명 할 수 있습니까? – Apollo2020

+0

그래프 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 3-4 2-5 4-5 –