python - 如何归一化一个计数器并组合 2 个归一化的计数器? - Python

标签 python list counter

首先,我有两个字符串列表:

['abc','abc','def','jkl']
['abc','def','def','pqr', 'pr', 'foo', 'bar']

然后我需要规范化的列表计数器,以便每个计数器中的值的总和等于 1:

Counter({'abc': 0.8164965809277261, 'jkl': 0.4082482904638631, 'def': 0.4082482904638631})
Counter({'abc': 1.1498299142610595, 'def': 1.0749149571305296, 'jkl': 0.4082482904638631, 'pr': 0.3333333333333333, 'bar': 0.3333333333333333, 'pqr': 0.3333333333333333, 'foo': 0.3333333333333333})

归一化因子是

math.sqrt(sum(i*i for i in counter.values()))

我已经通过迭代抛出计数器键尝试了以下操作,但是还有其他方法可以实现 say x+y 计数器吗?

>>> from collections import Counter
>>> import math
>>> x = Counter(['abc','abc','def','jkl'])
>>> denominator = 1/math.sqrt(sum(math.pow(i,2) for i in x.values()))
>>> for i in x:
...     x[i]*=denominator
... 
>>> x
Counter({'abc': 0.8164965809277261, 'jkl': 0.4082482904638631, 'def': 0.4082482904638631})
>>> y = Counter(['abc','def','def','pqr', 'pr', 'foo', 'bar'])
>>> denominator2 = 1/math.sqrt(sum(math.pow(i,2) for i in y.values()))
>>> for i in y:
...     y[i]*=denominator2
... 
>>> y
Counter({'def': 0.6666666666666666, 'pr': 0.3333333333333333, 'abc': 0.3333333333333333, 'bar': 0.3333333333333333, 'pqr': 0.3333333333333333, 'foo': 0.3333333333333333})
>>> x+y
Counter({'abc': 1.1498299142610595, 'def': 1.0749149571305296, 'jkl': 0.4082482904638631, 'pr': 0.3333333333333333, 'bar': 0.3333333333333333, 'pqr': 0.3333333333333333, 'foo': 0.3333333333333333})

最佳答案

您需要对值求和,然后将每个计数除以总和:

total = sum(x.values(), 0.0)
for key in x:
    x[key] /= total

通过从 0.0 开始求和,我们确保 total 是一个浮点值,避免了 / 的 Python 2 楼层除法行为整数操作数。

演示:

>>> from collections import Counter
>>> x = Counter(['abc','abc','def','jkl'])
>>> total = sum(x.values(), 0.0)
>>> for key in x:
...     x[key] /= total
... 
>>> x
Counter({'abc': 0.5, 'jkl': 0.25, 'def': 0.25})
>>> y = Counter(['abc','def','def','pqr', 'pr', 'foo', 'bar'])
>>> total = sum(y.values(), 0.0)
>>> for key in y:
...     y[key] /= total
... 
>>> y
Counter({'def': 0.2857142857142857, 'pr': 0.14285714285714285, 'abc': 0.14285714285714285, 'bar': 0.14285714285714285, 'pqr': 0.14285714285714285, 'foo': 0.14285714285714285})

如果您需要对计数器求和,则需要单独重新规范化生成的计数器;例如,将两个归一化计数器相加意味着您有一个新计数器的总和为 2。

关于python - 如何归一化一个计数器并组合 2 个归一化的计数器? - Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22428842/

相关文章:

python - 为什么列表的列表排序不正确?

python - 如何使用列表中的值作为对Python中另一个值的引用?

javascript - 在计数器上设置间隔发行

java - 如何解决计数器不平衡和重叠方法的算法?

python - 将avro文件索引到elasticsearch中

python - 如何在 matplotlib 中使次轴的网格间距相等?

python - 如何在 Python 中获取列表中的最后一个非空项?

python - pandas groupby 列来总结计数器性能

python - 找出句子中一定距离内的2个字符串

python - 为什么我的文本文件不断覆盖其中的数据?