将2D numpy.ndarray转换为嵌套字典

时间:2017-03-22 10:44:18

标签: python numpy dictionary multidimensional-array type-conversion

假设我有以下numpy.ndarray

array([[50,  0,  0],
      [ 0,  3, 47],
      [ 0, 36, 14]])

如何将其转换为此表格的字典:

{0: {0: 50}, 1: {1: 3, 2: 47}, 2: {1: 36, 2: 14}}

问题类似于python 2d array to dict,但无论我多么努力,我都无法找到与答案相似的解决方案。

4 个答案:

答案 0 :(得分:4)

假设a为您的数组,

试试这个,

{index:{i:j for i,j in enumerate(k) if j} for index,k in enumerate(a)}

结果

{0: {0: 50}, 1: {1: 3, 2: 47}, 2: {1: 36, 2: 14}}

使用以下概念创建的词典:

In [18]: dict([[1,'a'],[2,'b']])
Out[18]: {1: 'a', 2: 'b'}

答案 1 :(得分:2)

您可以使用一对嵌套的for循环来执行此操作。

内置的enumerate函数遍历列表或其他可迭代函数,为我们提供项目及其索引。

import numpy as np

a = np.array(
    [[50,  0,  0],
    [ 0,  3, 47],
    [ 0, 36, 14]]
)

d = {}
for i, row in enumerate(a):
    temp = {}
    for j, v in enumerate(row):
        if v:
            temp[j] = v
    d[i] = temp

print(d)

<强>输出

{0: {0: 50}, 1: {1: 3, 2: 47}, 2: {1: 36, 2: 14}}

使用嵌套的词典理解对可以大大缩小:

d = {i: {j: v for j, v in enumerate(row) if v}
    for i, row in enumerate(a)}

答案 2 :(得分:1)

只需循环并构建嵌套的dicts

import numpy as np

arr = np.array([[50,  0,  0],
               [ 0,  3, 47],
               [ 0, 36, 14]])

d = {}
for i, row in enumerate(arr):  
    d[i] = {}
    for j, cell in enumerate(row):
        if cell != 0:
            d[i][j] = cell

答案 3 :(得分:0)

此功能也应适用于二维阵列和一维阵列。另外,只需注释函数的第一行,就可以使它用于int / float列表。

def arrtodict(your_array):
    your_array = your_array.tolist()
    dict_data = {key: value for key, value in enumerate(your_array)}

    if type(dict_data[0]) is list: 
        for key, value in dict_data.items():
            dict_data[key] = {k: v for k, v in enumerate(value)}
    elif type(dict_data[0]) is (float or int):
        pass
    else:
        print ('Check Your data')
    return dict_data