嵌套列表到索引计数字典

时间:2017-06-23 18:20:27

标签: python list numpy dictionary keras

我对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处的值大于对于所有嵌套列表,对于两个嵌套列表(即第二个和第三个嵌套列表),索引3处的值大于0.2,依此类推。

非常感谢!

3 个答案:

答案 0 :(得分:4)

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

因此,一个实现将是 -

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}

答案 1 :(得分:1)

我只是写一个简单的代码

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)

答案 2 :(得分:1)

虽然Divakar对numpy给出了非常好的答案,但这是另一种不使用numpy使用ziplist unpackingenumerate的方法, sumdictionary 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}
相关问题