【问题标题】:Efficient way to convert numpy matrix into a nested dictionary将numpy矩阵转换为嵌套字典的有效方法
【发布时间】:2017-11-30 00:06:21
【问题描述】:

我有一个 NumPy2d 数组,它是一个对称矩阵(对角线上方的数字与对角线下方的数字相同的方阵)

输入矩阵示例:

edgeMatrix = np.array([[0., 2., 9.],
                       [2., 0., 1.],
                       [9., 1., 0.]])

我正在寻找一种非常有效的方法来将这个大矩阵转换为嵌套字典,其中第一个键是矩阵的行索引,第二个字典键是矩阵的列索引。例如:

所需的嵌套字典格式:

edgeDict[0][0] = 0
edgeDict[0][1] = 2
edgeDict[0][2] = 9
edgeDict[1][0] = 2
edgeDict[1][1] = 0
edgeDict[1][2] = 1
edgeDict[2][0] = 9
edgeDict[2][1] = 1
edgeDict[2][2] = 0

我曾尝试使用dict(enumerate(edgeMatrix.flatten(), 1)),但未能弄清楚如何让其嵌套方面发挥作用。

【问题讨论】:

  • 出于好奇,您为什么要dict 中的dict?列表列表具有相同的使用语法(用于读取数据/设置现有元素),但分配速度更快,内存占用更小,查找性能更快。
  • 我需要一个字典而不是一个列表的原因是这会输入一个需要字典而不是列表的包参数

标签: python python-3.x numpy


【解决方案1】:

您可以使用嵌套生成器表达式创建嵌套字典。

import numpy as np

edgeMatrix = np.array(
    [[0., 2., 9.],
    [2., 0., 1.],
    [9., 1., 0.]]
)

edgeDict = dict(enumerate(dict(enumerate(row)) for row in edgeMatrix))
print(edgeDict)

输出

{0: {0: 0.0, 1: 2.0, 2: 9.0}, 1: {0: 2.0, 1: 0.0, 2: 1.0}, 2: {0: 9.0, 1: 1.0, 2: 0.0}}

【讨论】:

  • 这是在 1.37 秒内运行
【解决方案2】:

试试这个:

In [5]: {i: {j: edgeMatrix[i,j] for (j, _) in enumerate(edgeMatrix[i])} 
for (i, __) in enumerate(edgeMatrix)}

Out[5]: 
{0: {0: 0.0, 1: 2.0, 2: 9.0},
 1: {0: 2.0, 1: 0.0, 2: 1.0},
 2: {0: 9.0, 1: 1.0, 2: 0.0}}

【讨论】:

  • 到目前为止,这是最快的方法。我把它计时在 0.046 秒!验证结果,如果数字正确,将接受答案。
  • 其实我在输入数据时犯了一个错误——这运行了 2.4 秒
【解决方案3】:

pandas 为您服务:

In [38]: pd.DataFrame(a).to_dict()
Out[38]: 
{0: {0: 0.0, 1: 2.0, 2: 9.0},
 1: {0: 2.0, 1: 0.0, 2: 1.0},
 2: {0: 9.0, 1: 1.0, 2: 0.0}}

【讨论】:

  • 工作和运行时间为 1.88 秒
猜你喜欢
  • 2012-05-24
  • 2021-03-02
  • 2021-11-25
  • 2019-02-18
  • 1970-01-01
  • 2016-11-05
  • 2021-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多