将numpy矩阵转换为嵌套字典的有效方法

时间:2017-11-29 14:48:54

标签: python python-3.x numpy

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

示例输入矩阵:

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

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

所需的嵌套dict格式:

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)),但未能弄清楚如何使这个工作的嵌套方面。

2 个答案:

答案 0 :(得分:1)

试试这个:

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

答案 1 :(得分:1)

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

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