【问题标题】:Nested list to a dictionary of index counts嵌套列表到索引计数字典
【发布时间】:2017-11-27 09:43:30
【问题描述】:

我是 Python 3 的新手,我正在使用 Keras sigmoid 激活,它会产生一个嵌套的概率列表。

我有一个看起来像这样的嵌套列表:

[[0.1, 0.2, 0.3, 0.2, 0.4, 0.5]
 [0.2, 0.3, 0.3, 0.3, 0.2, 0.1]
 ...
 [0.1, 0.1, 0.4, 0.5, 0.1, 0.2]]

我想要做的是将此列表转换为索引字典,其中每个索引键都有一个对应的频率计数,即它在列表中满足特定条件的次数。

例如,给定上面示例嵌套列表中的三行并给定条件:

element > 0.2

它将构建以下字典:

[
    0: 0
    1: 1
    2: 3
    3: 2
    4: 1
    5: 1
]

这是因为在三个嵌套列表中,索引 0 处的值永远不会大于 0.2,索引 1 处的值仅大于 0.2 一次(在第二个嵌套列表处),索引 2 处的值大于0.2 对于所有嵌套列表,索引 3 处的值对于两个嵌套列表(即第二个和第三个嵌套列表)都大于 0.2,依此类推。

非常感谢!

【问题讨论】:

    标签: python list numpy dictionary keras


    【解决方案1】:

    使用a 作为相同长度列表的列表,我们可以转换为一个数组,给我们一个2D 数组。然后,与2 进行比较,然后将每列的True 匹配项求和,作为计数。最后设置输出字典。

    因此,一种实现方式是 -

    C = (np.asarray(a)>0.2).sum(axis=0)
    dict_out = {i:c for i,c in enumerate(C)}
    

    np.count_nonzero 也可以用来代替 np.sum 在那里对匹配进行求和。

    示例运行 -

    In [209]: a
    Out[209]: 
    [[0.1, 0.2, 0.3, 0.2, 0.4, 0.5],
     [0.2, 0.3, 0.3, 0.3, 0.2, 0.1],
     [0.1, 0.1, 0.4, 0.5, 0.1, 0.2]]
    
    In [210]: C = (np.asarray(a)>0.2).sum(axis=0)
    
    In [211]: C
    Out[211]: array([0, 1, 3, 2, 1, 1])
    
    In [212]: {i:c for i,c in enumerate(C)}
    Out[212]: {0: 0, 1: 1, 2: 3, 3: 2, 4: 1, 5: 1}
    

    处理参差不齐的子列表

    对于参差不齐的子列表(输入列表中具有不同长度的列表),我们可以在使用无效说明符填充值时将其转换为常规数组(NaN 在这里似乎合适),然后沿适当的轴求和。因此,为了处理这种情况,修改后的实现将是 -

    from itertools import izip_longest # For Python3, use zip_longest
    
    C = (np.array(list(izip_longest(*a, fillvalue=np.nan)))>0.2).sum(1)
    dict_out = {i:c for i,c in enumerate(C)}
    

    示例运行 -

    In [253]: a
    Out[253]: 
    [[0.1, 0.2, 0.3, 0.2, 0.4, 0.5, 0.7, 0.2],
     [0.2, 0.3, 0.3, 0.3, 0.2, 0.1],
     [0.1, 0.1, 0.4, 0.5, 0.1, 0.2, 0.1]]
    
    In [254]: C = (np.array(list(izip_longest(*a, fillvalue=np.nan)))>0.2).sum(1)
    
    In [255]: {i:c for i,c in enumerate(C)}
    Out[255]: {0: 0, 1: 1, 2: 3, 3: 2, 4: 1, 5: 1, 6: 1, 7: 0}
    

    【讨论】:

      【解决方案2】:

      我只是写了一个简单的代码

      a = [[0.1, 0.2, 0.3, 0.2, 0.4, 0.5], [0.2, 0.3, 0.3, 0.3, 0.2, 0.1],
           [0.1, 0.1, 0.4, 0.5, 0.1, 0.2]]
      dic = {'0': 0, '1': 0, '2': 0, '3': 0, '4': 0}
      var = [x*0 for x in range(5)]
      
      for array in a:
          for i in range(5):
              if array[i] > 0.2:
                  var[i] += 1
      
      dic = {'0': var[0], '1': var[1], '2': var[2], '3': var[3], '4': var[4]}
      print(dic)
      

      【讨论】:

        【解决方案3】:

        虽然 Divakar 使用 numpy 给出了非常好的答案,但这是另一种不使用 numpy 的方式,它使用 ziplist unpackingenumeratesumdictionary comprehension。只需将 i > 0.2 替换为您想要的任何条件即可:

        x = [[0.1, 0.2, 0.3, 0.2, 0.4, 0.5], [0.2, 0.3, 0.3, 0.3, 0.2, 0.1], [0.1, 0.1, 0.4, 0.5, 0.1, 0.2]]
        
        print({current_index:sum(i > 0.2 for i in values) for current_index, values in enumerate(zip(*x))})
        
        >> {0: 0, 1: 1, 2: 3, 3: 2, 4: 1, 5: 1}
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-04-04
          • 1970-01-01
          • 2022-07-01
          • 2018-08-02
          • 1970-01-01
          • 2017-08-30
          • 1970-01-01
          相关资源
          最近更新 更多