【问题标题】:Convert 2D numpy.ndarray to nested dictionary将 2D numpy.ndarray 转换为嵌套字典
【发布时间】:2017-08-14 10:18:04
【问题描述】:

假设我有以下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,但无论我多么努力,我都无法找到与那里的答案类似的解决方案。

【问题讨论】:

  • 这称为将稀疏二维数组转换为COO(坐标)格式的嵌套字典:{i: {j: value}}

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


【解决方案1】:

假设 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'}

【讨论】:

  • 使用 dict 理解 IMO 会更具可读性:{index:{i:j for i,j in enumerate(k) if j} for index,k in enumerate(a)}
【解决方案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)}

【讨论】:

    【解决方案3】:

    只需循环并构建您的嵌套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
    

    【讨论】:

      【解决方案4】:

      此函数也适用于二维数组和一维数组。此外,您可以通过注释函数的第一行使其适用于带有 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
      

      【讨论】:

        猜你喜欢
        • 2014-08-11
        • 2020-09-03
        • 2013-12-07
        • 1970-01-01
        • 2022-12-05
        • 1970-01-01
        • 1970-01-01
        • 2013-11-16
        相关资源
        最近更新 更多