在python中把相邻关系列表转换为相邻关系矩阵。

问题描述 投票:0回答:1

试图写一个代码,将图的表示从邻接列表转换为邻接矩阵。

该函数应该输入一个邻接列表 adj_list = [[1,2],[2],[],[0,1]] 并输出二进制矩阵

adj_mat = [0. 1. 1. 0]
          [0. 0. 1. 0.]
          [0. 0. 0. 0.]
          [1. 1. 0. 0.] 

然而运行该代码

 def adj_list_to_matrix(adj_list):
    n = len(adj_list)
    adj_matrix = np.nan * np.ones((n,n))
    np.fill_diagonal(adj_matrix,0)

    for i in range(n):
        for j, w in adj_list[i]:
            adj_matrix[i,j] = w
    return adj_matrix

产生错误信息

for j, w in adj_list[i]:
TypeError: cannot unpack non-iterable int object 

谁能帮助解决这个问题,得到一个可行的代码?

python function adjacency-matrix adjacency-list
1个回答
0
投票

for j, w in adj_list[i]: 不工作,因为 adj_list[i] 只是一个列表,所以你只能在for循环中解包出一个值。看起来你想要的是 w 作为权重因子,但你的邻接列表没有任何权重。

你可以这样做,假设所有的权重都是1(我想这是你基于问题中的预期输出而想要的)。

def adj_list_to_matrix(adj_list):
    n = len(adj_list)
    adj_matrix = np.nan * np.ones((n,n))
    np.fill_diagonal(adj_matrix,0)

    for i in range(n):
        for j in adj_list[i]:
            adj_matrix[i,j] = 1
    return adj_matrix

输出

[[ 0.,  1.,  1., nan],
 [nan,  0.,  1., nan],
 [nan, nan,  0., nan],
 [ 1.,  1., nan,  0.]])

加权邻接矩阵

如果你想要一个加权邻接矩阵,你需要把权重放在 adj_list 像这样。

adj_list = [{1:0.2,2:0.5},{2:1},{},{0:0.1,1:0.6}]

那么你的代码只需要稍加修改就可以了。

def adj_list_to_matrix(adj_list):
    n = len(adj_list)
    adj_matrix = np.nan * np.ones((n,n))
    np.fill_diagonal(adj_matrix,0)

    for i in range(n):
        for j, w in adj_list[i].items():
            adj_matrix[i,j] = w
    return adj_matrix

产出

[[0. , 0.2, 0.5, nan],
 [nan, 0. , 1. , nan],
 [nan, nan, 0. , nan],
 [0.1, 0.6, nan, 0. ]]
© www.soinside.com 2019 - 2024. All rights reserved.