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

标签 python dictionary for-loop adjacency-matrix adjacency-list

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

示例矩阵:

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

示例输出:

{0: [1], 1: [], 2: [1, 3], 3: [], 4: [3, 5], 5: [0]}

我下面的代码实际上生成了正确的输出;但是,我认为这是非常低效的,因为我使用了两个 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

最佳答案

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

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

随机 1000x1000 矩阵的时间:

  1. 原码:310ms
  2. @Denxiloe 的代码:91 毫秒
  3. 这段代码:20ms

关于python - 将邻接矩阵转换为字典的有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52322847/

相关文章:

python - 光谱聚类、图像分割和特征向量

arrays - 类型 'Any' 在 Swift 中没有下标成员

python - 使用 for 循环创建圣诞树

python - 如何提取两个张量之间不等价条目的索引?

python - “工作簿”对象没有属性 'add_chart'

java - 自定义 equals() 方法无法正常工作

matlab - 如何创建随行索引和数据变化的三角矩阵?

ios - 字符串的大写 NSArray?

python - Tk Text 小部件的 Twisted 和 Tkinter 问题

c++ - STL 容器的 Clear() 方法是否调用堆对象上的 delete?