2013-03-23 15 views
10

Tôi có một đối tượng nhiều chữ và muốn chuyển đổi nó thành một đối tượng đồ thị đơn giản với các cạnh có trọng số. Tôi đã xem xét các tài liệu networkx và dường như không thể tìm thấy một chức năng được xây dựng để đạt được điều này. Tôi đã chỉ tự hỏi nếu có ai biết về một chức năng tích hợp trong networkx có thể đạt được mục tiêu này. Tôi đã xem các hàm to_directed(), to_undirected() nhưng chúng không phục vụ mục tiêu của tôi.Networkx: Chuyển đổi nhiều chữ vào biểu đồ đơn giản với các cạnh có trọng số

+0

Liệu multigraph đã trọng? Và nếu bạn muốn kết hợp các trọng số từ các cạnh song song theo một cách nào đó để xây dựng một biểu đồ? – Aric

+0

Có đó chính xác tình hình. – anonuser0428

Trả lời

14

Dưới đây là một cách để tạo ra một đồ thị có trọng số từ một multigraph trọng bằng cách tổng hợp các trọng:

cạnh
import networkx as nx 
# weighted MultiGraph 
M = nx.MultiGraph() 
M.add_edge(1,2,weight=7) 
M.add_edge(1,2,weight=19) 
M.add_edge(2,3,weight=42) 

# create weighted graph from M 
G = nx.Graph() 
for u,v,data in M.edges(data=True): 
    w = data['weight'] if 'weight' in data else 1.0 
    if G.has_edge(u,v): 
     G[u][v]['weight'] += w 
    else: 
     G.add_edge(u, v, weight=w) 

print(G.edges(data=True)) 
# [(1, 2, {'weight': 26}), (2, 3, {'weight': 42})] 
+0

Đây là một giải pháp tuyệt vời, gần như chính xác những gì tôi đang tìm kiếm, ngoại trừ MultiGraph của tôi không có thuộc tính 'weight' trên các cạnh. Tôi đã đề xuất một bản cập nhật nhỏ cho mã của bạn, vì vậy nó sẽ mặc định trọng số là 1.0 nếu không có thuộc tính như vậy. –

10

Một cách rất đơn giản để thực hiện việc này là chỉ cần truyền số nhiều của bạn làm đầu vào Graph.

import networkx as nx 

G = nx.MultiGraph() 
G.add_nodes_from([1,2,3]) 
G.add_edges_from([(1, 2), (1, 2), (1, 3), (2, 3), (2, 3)]) 

G2 = nx.Graph(G) 

Điều này sẽ tạo ra một đồ thị vô hướng của bội số của bạn khi nhiều cạnh được hợp nhất thành các cạnh đơn. Tuy nhiên, nếu bạn có các thuộc tính khác nhau cho các cạnh được hợp nhất, tôi không biết có cách nào để xác định thuộc tính nào được giữ lại hay không.

+0

Rất hữu ích khi biết rằng một MultiGraph có thể dễ dàng được chuyển đổi thành Đồ thị, nhưng nó không giải quyết được yêu cầu của OP đối với các cạnh có trọng số. – TheEspinosa