繁体   English   中英

将邻接列表转换为 python 中的邻接矩阵

[英]Converting adjacency list to adjacency matrix in python

尝试编写代码将图形表示从邻接列表转换为邻接矩阵。

function 应输入邻接列表adj_list = [[1,2],[2],[],[0,1]]和 output 二进制矩阵

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 

任何人都可以帮助解决此问题以获取工作代码吗?

for j, w in adj_list[i]:不起作用,因为adj_list[i]只是一个列表,所以你只能在 for 循环中解压缩一个值。 看起来您希望w成为权重因子,但您的邻接列表没有任何权重。

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

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

output

[[ 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

output

[[0. , 0.2, 0.5, nan],
 [nan, 0. , 1. , nan],
 [nan, nan, 0. , nan],
 [0.1, 0.6, nan, 0. ]]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM