将邻接矩阵转换为字典的有效方法是什么?

dje*_*acs 3 python dictionary for-loop adjacency-list adjacency-matrix

我想知道将邻接矩阵转换为表示一个节点与另一个节点之间的连接的字典的有效方法是什么?

矩阵示例:

matrix = [
[0,1,0,0,0,0],
[0,0,0,0,0,0],
[0,1,0,1,0,0],
[0,0,0,0,0,0],
[0,0,0,1,0,1],
[1,0,0,0,0,0]
]
Run Code Online (Sandbox Code Playgroud)

输出示例:

{0: [1], 1: [], 2: [1, 3], 3: [], 4: [3, 5], 5: [0]}
Run Code Online (Sandbox Code Playgroud)

我下面的代码实际上生成了正确的输出;但是,我认为这是非常低效的,因为我使用了两个 for 循环。有什么方法可以在不使用任何库的情况下优化我的代码吗?请告诉我,谢谢!

def convertAdjMatrixtoDict(m):

    graph = {}
    for idx, row in enumerate(m):
        res = []
        for r in range(len(row)):
            if row[r] != 0:
                res.append(r)
            graph[idx] = res
    return graph
Run Code Online (Sandbox Code Playgroud)

DYZ*_*DYZ 5

NumPy通过使用定位每行中的非零元素可以获得更好的性能:

import numpy as np
{i: np.nonzero(row)[0].tolist() for i,row in enumerate(matrix)}
Run Code Online (Sandbox Code Playgroud)

随机 1000x1000 矩阵的时序:

  1. 原始代码:310ms
  2. @Denxiloe 的代码:91ms
  3. 此代码:20ms