2011-10-10 2 views
0

그래프에서 노드 1과 나머지 노드 사이의 노드 연결을 찾고 싶습니다. 등등 167 개 라인모든 노드에 대해 변수 반복 | 파이썬에서의 노드 연결 그래프

1 2 1 
1 35 1 
8 37 1 

을하고 다음과 같이 입력 텍스트 파일 형식입니다. 첫 번째 열은 원본 노드를 나타내고 두 번째 열은 대상 노드를 나타내며 마지막 열은 가장자리의 무게를 나타냅니다.

입력 파일에서 대상 노드를 읽고 그 사이에 가장자리를 형성하려고합니다. 그때 그것이 연결된 네트워크 (그래프의 한 구성 요소와 하위 구성 요소가 아닌지)를 알아 내야합니다. 여기서 수동

G.add_edge(1, 2) 

작동하여 가장자리 부가 코드

from numpy import* 
import networkx as nx 
G=nx.empty_graph() 

for row in file('out40.txt'): 
    row = row.split() 
    src = row[0] 
    dest = row[1] 
    #print src 
    G.add_edge(src, dest) 
    print src, dest 

for i in range(2, 41): 
    if nx.bidirectional_dijkstra(G, 1, i): print "path exists from 1 to ", i 

하지만 이러한 광산 큰 입력 파일에 적합 지루하고 아니다. if 루프 조건은 가장자리를 수동으로 추가 할 때 작동하지만 위 코드에 대해 다음 오류가 발생합니다.

in neighbors_iter 
raise NetworkXError("The node %s is not in the graph."%(n,)) 
networkx.exception.NetworkXError: The node 2 is not in the graph. 

도움이 될 것입니다!

답변

2

코드에서 노드 "1""2" 등을 추가하는 것입니다. 명시 적으로 변환하지 않으면 파일에서 읽는 것이 문자열을 제공하기 때문입니다.

그러나 노드 12을 참조하려고합니다. 나는 networkx을 생각하지 않는다고 생각합니다. 2 == "2". 보십시오이 변경

... 이것에

G.add_edge(src, dest) 

:

그것이 당신을위한 옵션이지만, 당신이 알고있는 경우
G.add_edge(int(src), int(dest)) 
+0

감사합니다. 그것은 효과가 있었다. – learner

+0

@bhanu : 이것이 당신에게 적합한 해결책이라면, 그걸로 표시해주세요. (그리고 유용한 답변을 투표하십시오) – Rabarberski

+0

@Rabarberski 나는 그것을했습니다! 고맙습니다. – learner

0

documentationNetworkx에서 :

for row in file('out40.txt'): 
    row = row.split() 
    src = row[0] 
    dest = row[1] 
    G.add_nodes_from([src, dest]) 
    #print src 
    G.add_edge(src, dest) 
    print src, dest 

오류 메시지가 그래프 G 당신이 사이에서 우위를 만들기 위해 찾고있는 노드가없는 말했다.

+0

앰버가 대답했습니다. 정수로 타입 변환하지 않았습니다. 감사! – learner

2

있는지 아니 networkx의 지원 빌드 - 여러 그래프 텍스트 형식?

edge list format은 귀하의 사례에 꽤 잘 맞는 것으로 보입니다. 이후에 할 수

G = nx.read_weighted_edgelist(filename) 

당신이 (당신이 그들을 필요로하지 않기 때문에) 가중치를 제거하려면, 다음과 같은 : 특히 다음 방법은 사용자 지정 코드가 필요없이 입력 파일을 읽을

for e in G.edges_iter(data=True): 
    e[2].clear()     #[2] is the 3rd element of the tuple, which 
            #contains the dictionary with edge attributes 
+0

감사합니다. 나는 그것에 대해 조사하지 않았습니다. 나는 이것을 탐구 할 것이다. – learner

+0

필자가 내 대답을 편집 했으므로'read_weighted_edgelist()'메소드가 내가 생각하는 바로 그 것이다. – Rabarberski

+0

좋습니다! 나는 가중치가있는 가장자리로 작업 할 때 이것을 사용할 것이라고 생각합니다. 현재 가중치가 적용되지 않은 가장자리로 작업하고 있습니다. 고맙습니다! – learner

0

"is_connected()"를 사용하여 좀 더 간단하게 만들 수도 있습니다. 예 :

$ cat disconnected.edgelist 
1 2 1 
2 3 1 
4 5 1 
$ cat connected.edgelist 
1 2 1 
2 3 1 
3 4 1 
$ ipython 

In [1]: import networkx as nx 

In [2]: print(nx.is_connected(nx.read_weighted_edgelist('disconnected.edgelist'))) 
False 

In [3]: print(nx.is_connected(nx.read_weighted_edgelist('connected.edgelist'))) 
True 
+0

감사합니다. @aric, 그래프가 연결되어 있는지 확인하려면 'nx.number_connected_components (G)'를 사용하고 있습니다. 그러나 그래프의 두 연결되지 않은 구성 요소를 조인 할 수있는 방법이 있는지 알고 싶습니다. 어떤 접근법을 알고 있습니까? 고맙습니다. – learner

관련 문제