2014-04-23 4 views
5

나는 꽤 오랫동안 networkx로 작업 해 왔으며 최근 커뮤니티 검색을 조사하기까지는 최소한의 조정만으로 내 목적에 매우 잘 부합하고 있습니다. 비교해 보면, igraph Python 패키지는 토양 Aynaud의 커뮤니티 패키지가 추가 된 networkx와 비교해도 커뮤니티 검색 방법을 훨씬 광범위하게 구현 한 것으로 보입니다. 네트워크 그래프를 igraph 구조로 쉽게 변환 할 수있는 기존의 테스트 된 API가 있는지 궁금 할뿐입니다. 따라서이 분야에서 igraph가 제공하는 강력한 기능을 사용할 수 있습니까?networkx와 igraph 사이의 인터페이스

친절한 답변을 보내 주시면 감사하겠습니다.

답변

4

Networkx와 python-igraph는 모두 광범위한 읽기/쓰기 알고리즘 (networkx, python-igraph)을 지원합니다.

적어도 두 가지 형식 (GML 및 pajek)이이 두 가지 버전에서 공통적 인 것으로 보입니다. 여기

+0

빠른 답변을 주신 Andrew에게 감사드립니다. iGraph에서 NetwrokX 그래프의 위상 구조 만 재구성하는 것은 상당히 사소한 것으로 나타났습니다. 까다로운 부분은 노드 및 가장자리 속성이었습니다. 그러나 이것은 커뮤니티 탐지를 위해 충분할 것입니다 : –

6

igraph에 NetworkX 그래프로 변환하는 두 가지 방법 :

In [5]: g = nx.planted_partition_graph(50, 50, 0.9, 0.1, seed=3) 

In [6]: %timeit ig.Graph(len(g), zip(*zip(*nx.to_edgelist(g))[:2])) 
1 loops, best of 3: 264 ms per loop 

In [7]: %timeit ig.Graph.Adjacency((nx.to_numpy_matrix(g) > 0).tolist()) 
1 loops, best of 3: 496 ms per loop 

사용 : 에지리스트 빨리 다음 2500 노드 그래프 내 컴퓨터에 다소이었다 사용

import networkx as nx, igraph as ig 

# create sample NetworkX graph 
g = nx.planted_partition_graph(5, 5, 0.9, 0.1, seed=3) 

# convert via edge list 
g1 = ig.Graph(len(g), zip(*zip(*nx.to_edgelist(g))[:2])) 
    # nx.to_edgelist(g) returns [(0, 1, {}), (0, 2, {}), ...], which is turned 
    # into [(0, 1), (0, 2), ...] for igraph 

# convert via adjacency matrix 
g2 = ig.Graph.Adjacency((nx.to_numpy_matrix(g) > 0).tolist()) 

assert g1.get_adjacency() == g2.get_adjacency() 

을 가장자리 목록도 g = nx.complete_graph(2500)의 경우 다소 빨랐습니다.

G = nx.from_edgelist([(names[x[0]], names[x[1]]) 
         for names in [g.vs['name']] # simply a let 
         for x in g.get_edgelist()], nx.DiGraph()) 

:

+1

이 응답은 파이썬 3을 위해 업데이트 될 수 있습니다.'zip'은 더 이상 subscript-able이 아닙니다. –

0

I 노드의 이름을 저장하려고 바와 같이/igraph 또는 NX 모두 가장자리는이 igraph 객체, g에서 전송하는 동안 또한 NX로, 노드 이름을 전송 내 한 줄 버전입니다 그리고 반대의 방법 G하는 NX 객체 경우, 주어진하지만, igraph 개체가 필요합니다 : 물론

g = igraph.Graph.TupleList(G.edges(), directed=True) 

이가 다른 노드 속성으로 완료되지 전송도 전송이 누락 된 속성 가장자리하지만 난 것 희망 당신이 그들을 가질 때 유용합니다. 전송하는 동안 igraph에서 NX로,보다 효율적으로 제어 할 수


더 자세한 버전 : NX에서

G = nx.DiGraph() 
names = g.vs['name'] 
G.add_nodes_from(names) 
G.add_edges_from([(names[x[0]], (names[x[1]])) for x in g.get_edgelist()]) 

가 igraph하기 :

g = igraph.Graph(directed=True) 
g.add_vertices(G.nodes()) 
g.add_edges(G.edges()) 

(도 here 게시)