在python中创建有向图的邻接矩阵

时间:2015-11-03 07:49:22

标签: python dictionary matrix

我试图在python中创建一个有向图的邻接矩阵。我理解邻接矩阵的概念。但是我无法在python中创建邻接矩阵。我用链接和轮廓表示了有向图。 inlinks意味着如果有一个节点的传入边缘,并且outlinks意味着是否存在来自节点的传出链接。如何在python中使用以下图形创建一个邻接矩阵。我真的被困在这里。请建议我创建方法邻接矩阵。

{'19.json': {'outlink': [], 'inlink': []}, '26.json': {'outlink': [], 'inlink': []}, '4.json': {'outlink': [], 'inlink': []}, '25.json': {'outlink': [], 'inlink': []}, '1.json': {'outlink': [], 'inlink': ['17.json', '2.json']}, '24.json': {'outlink': [], 'inlink': []}, '13.json': {'outlink': [], 'inlink': []}, '16.json': {'outlink': [], 'inlink': []}, '14.json': {'outlink': ['17.json', '2.json'], 'inlink': []}, '17.json': {'outlink': ['1.json', '23.json'], 'inlink': ['14.json']}, '15.json': {'outlink': [], 'inlink': []}, '3.json': {'outlink': [], 'inlink': []}, '9.json': {'outlink': [], 'inlink': []}}

1 个答案:

答案 0 :(得分:0)

一旦您解析字典以使其更易于创建图形(例如,由边连接的节点列表),就可以使用NetworkX轻松完成此操作。

我将使用

生成有向图的nodesedges的列表
data = {'19.json': {'outlink': [], 'inlink': []}, 
        '26.json': {'outlink': [], 'inlink': []}, 
        '4.json': {'outlink': [], 'inlink': []}, 
        '25.json': {'outlink': [], 'inlink': []}, 
        '1.json': {'outlink': [], 'inlink': ['17.json', '2.json']}, 
        '24.json': {'outlink': [], 'inlink': []}, 
        '13.json': {'outlink': [], 'inlink': []}, 
        '16.json': {'outlink': [], 'inlink': []}, 
        '14.json': {'outlink': ['17.json', '2.json'], 'inlink': []}, 
        '17.json': {'outlink': ['1.json', '23.json'], 'inlink': ['14.json']}, 
        '15.json': {'outlink': [], 'inlink': []}, 
        '3.json': {'outlink': [], 'inlink': []}, 
        '9.json': {'outlink': [], 'inlink': []}}

# nodes are the keys of the dict
nodes = data.keys()

# edges can be found via list comprehensions to create a list of pairs connected by an edge
outedges = [(k, j) for k in data.keys() for j in data[k]['outlink']] 
inedges = [(j, k) for k in data.keys() for j in data[k]['inlink']]
edges = set(outedges + inedges)

然后将它们传递给NetworkX方法以进行有向图创建

import networkx as nx

# we can create the directed graph
G = nx.DiGraph()

# add all nodes and edges to it
G.add_nodes_from(nodes)
G.add_edges_from(edges)

# we may even draw the graph to inspect it
nx.draw(G, with_labels=True)

最后,您可以使用

计算邻接矩阵
M = nx.adjacency_matrix(G).todense()