我对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,依此类推。
非常感谢!
答案 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
使用zip
,list unpacking
,enumerate
的方法, sum
和dictionary 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}