2014-04-23 18 views
5

Tôi đã làm việc với networkx trong một thời gian ngắn và nó đã được phục vụ cho mục đích của tôi khá tốt với các chỉnh sửa tối thiểu cho đến gần đây khi tôi bắt đầu xem xét phát hiện cộng đồng. Trong khi đó, gói igraph Python dường như có một triển khai rộng rãi hơn nhiều phương pháp phát hiện cộng đồng (thậm chí so với networkx với gói cộng đồng của Thomas Aynaud được thêm vào). Tôi chỉ tự hỏi liệu có bất kỳ API đã kiểm tra hiện có nào cho phép dễ dàng dịch biểu đồ mạng vào cấu trúc igraph không, vì vậy tôi có thể tận dụng bản thân igraph điện cung cấp trong lĩnh vực này?Giao diện giữa networkx và igraph

Câu trả lời tử tế của bạn được đánh giá cao.

Trả lời

4

Networkx và python-igraph đều hỗ trợ một loạt các thuật toán đọc/ghi (networkx, python-igraph).

Ít nhất hai định dạng (GML và pajek) dường như là phổ biến giữa hai loại, mặc dù tôi chưa thử.

+0

Cảm ơn bạn Andrew cho câu trả lời nhanh chóng của bạn. Nó chỉ ra rằng nó khá tầm thường để tái tạo lại các cấu trúc tôpô của một đồ thị NetwrokX trong iGraph - bit khéo léo là các thuộc tính nút và cạnh. Nhưng điều này sẽ đủ để phát hiện cộng đồng :) –

6

đây hai cách để chuyển đổi một đồ thị NetworkX một igraph:

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() 

Sử dụng danh sách cạnh là hơi nhanh hơn cho đồ thị 2500-nút sau trên máy tính của tôi:

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 

Sử dụng danh sách cạnh cũng nhanh hơn một chút cho g = nx.complete_graph(2500).

+1

Phản hồi này có thể được cập nhật cho Python 3. 'zip' không còn có thể đăng ký. –

0

Như tôi đã cố gắng để lưu trữ tên của các nút/mép trên cả igraph hoặc nx, đây là phiên bản one-liner của tôi mà cũng chuyển tên nút trong khi chuyển từ đối tượng igraph, g, để nx:

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()) 

và cách ngược lại nếu G, một đối tượng nx, được đưa ra nhưng một đối tượng igraph là cần thiết:

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

Tất nhiên đây không phải là hoàn toàn chuyển giao như là thuộc tính nút khác và cũng có thể cạnh thuộc tính chuyển bị thiếu nhưng tôi hy vọng sẽ là hữu ích khi bạn không có chúng.


phiên bản More tiết mà bạn có quyền kiểm soát nhiều hơn trong khi chuyển từ igraph để 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()]) 

Từ nx để igraph:

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

(cũng gửi here)

Các vấn đề liên quan