【问题标题】:Trying to convert adjacency list to adjacency matrix in Python尝试在Python中将邻接列表转换为邻接矩阵
【发布时间】:2017-04-23 12:49:30
【问题描述】:

尽管我知道自己做错了什么,但我仍在努力弄清楚如何有效地实施这一点。我正在尝试让我的代码读取邻接列表,例如无向加权图:

[(1,5)], [(0,5), (2,7)], [(1,7)]

然后将其转换为邻接矩阵,该矩阵将返回:

[0, 5, inf], [5, 0, 7], [inf, 7, 0]

然而,下面的代码返回 [0, 5, inf], [5, inf, 0, inf, 7], [inf, 7, 0],我知道这是为什么。但是,我只想在 [0, 5, inf] 等情况下将“inf”附加到邻接矩阵,因为 0 不与 2 相邻,因此其权重为“inf”。最好的解决方案是什么?

def adjacency_matrix(graph_string):
    adj_list = adjacency_list(graph_string)
    n = len(adj_list)
    adj_mat = [[] for _ in range(n)]
    for i in range(n):
        for j in range(n):
            if j == i:
                adj_mat[i].append(0)
            else:
                for neighbour, weight in adj_list[i]:
                    if j == neighbour:
                        adj_mat[i].append(weight)
                        break
                    elif j != neighbour:
                        adj_mat[i].append(float('inf'))
    return adj_mat

【问题讨论】:

  • adjacency_list函数是什么?
  • 请使用示例graph_stringadjacency_list 函数提供您的问题的完整示例。

标签: python algorithm matrix


【解决方案1】:

问题似乎出在elif 部分

elif j != neighbour:
    adj_mat[i].append(float('inf'))

因为您只想为缺少的边缘填充inf。如果您对adj_list 进行了排序,则使用条件elif j < neighbour 是正确的。

但是,更好的解决方案是使用零对角线和其他位置的 inf 值初始化邻接矩阵。并且只填充邻接列表中的权重。这样您就可以避免考虑非边。

这是一个简短的示例,如何使用 numpy 来实现。

import numpy as np

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

用法:

adj_list = [(1,5)], [(0,5), (2,7)], [(1,7)]
adj_list_to_matrix(adj_list)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多