个人网站开发网,湖南长沙微信平台号,模板网站建设明细报价表,网站怎么绑定织梦点击上方AI机器学习与深度学习算法#xff0c;选择星标公众号原创干货#xff0c;第一时间送达在很多场景中经常会用到统计计数的需求#xff0c;比如在实现 kNN 算法时统计 k 个标签值的个数#xff0c;进而找出标签个数最多的标签值作为最终 kNN… 点击上方AI机器学习与深度学习算法选择星标公众号原创干货第一时间送达在很多场景中经常会用到统计计数的需求比如在实现 kNN 算法时统计 k 个标签值的个数进而找出标签个数最多的标签值作为最终 kNN 算法的预测结果。Python内建的 collections 集合模块中的 Counter 类能够简洁、高效的实现统计计数。Counter 是 dict 字典的子类Counter 拥有类似字典的 key 键和 value 值只不过 Counter 中的键为待计数的元素而 value 值为对应元素出现的次数 count为了方便介绍统一使用元素和 count 计数来表示。虽然 Counter 中的 count 表示的是计数但是 Counter 允许 count 的值为 0 或者负值。实例化 Counter 类如果要使用 Counter必须要进行实例化在实例化的同时可以为构造函数传入参数来指定不同类型的元素来源。from collections import Counter# 实例化元素为空的 Counter 对象a Counter()# 从可迭代对象中实例化 Counter 对象b Counter(chenkc)# 从 mapping 中实例化 Counter 对象c Counter({a:1, b:2, c:3})# 从关键词参数中实例化 Counter 对象d Counter(a 1, b 2, c 3)实例化元素为空的 Counter 对象之后可以通过为字典添加元素的方式为 Counter 对象添加元素。from collections import Counter# 实例化元素为空的 Countera Counter()# 为 Counter 添加元素以及对应的 count 计数a[a] 1a[b] 2a[c] 3 print(a)Counter({c: 3, b: 2, a: 1})从 string(字符为list列表的元素)、list 和 tuple 这些可迭代对象中获取元素。from collections import Counter# 从可迭代对象中实例化 Counterb Counter(chenkc) # stringb2 Counter([c, h, e, n, k, c]) # listb3 Counter((c, h, e, n, k, c)) # tuple print(b)Counter({c: 2, h: 1, e: 1, n: 1, k: 1}) print(b2)Counter({c: 2, h: 1, e: 1, n: 1, k: 1}) print(b3)Counter({c: 2, h: 1, e: 1, n: 1, k: 1})从 mapping 中实例化 Counter 对象mapping 类型的数据就是元素为(x, y)的列表字典也属于 mapping 类型的数据。from collections import Counter# 从 mapping 中实例化 Counter 对象c Counter([(a, 1), (b, 2), (a, 3), (c, 3)])c2 Counter({a:1, b:2, a:3, c:3}) # 字典 print(c)Counter({(a, 1): 1, (b, 2): 1, (a, 3): 1, (c, 3): 1}) print(c2)Counter({a: 3, c: 3, b: 2})虽然传入的 mapping 类型的数据是一样的但是由于字典中的键是唯一的因此如果字典中的键重复会保留最后一个。dic {a:1, b:2, a:3, c:3} print(dic){a: 3, b: 2, c: 3}从关键词参数中实例化 Counter 对象关键词参数中指定的关键词必须是唯一的但是不同于字典如果指定的关键词重复程序会抛出SyntaxError异常。from collections import Counter# 从关键词参数中实例化 Counter 对象d Counter(a 1, b 2, c 3)# d2 Counter(a 1, b 2, a 3, c 3) # SyntaxError print(d)Counter({c: 3, b: 2, a: 1})我们都知道在字典中查找不存在的键程序会抛出 KyeError的异常但是由于 Counter 用于统计计数因此 Counter 不同于字典如果在 Counter 中查找一个不存在的元素不会产生异常而是会返回 0这其实很好理解Counter 计数将不存在元素的 count 值设置为 0 。from collections import Counterc Counter({a:1, b:2, c:3}) print(c[d]) # 查找键值为d对应的计数0 print(c)Counter({c: 3, b: 2, a: 1})c[d]表示的查找返回元素值为d的 count 计数而如果使用c[d] 0则表示的是为 Counter 添加元素。from collections import Counterc Counter({a:1, b:2, c:3})c[d] 4 # 为 Counter 添加元素 print(c[d])4 print(c)Counter({d: 4, c: 3, b: 2, a: 1})Counter 中的方法实例化 Counter 类对象之后就可以使用 Counter 对象中的方法。由于 Counter 类继承自 dict 类所以 Counter 类可以使用 dict 类的方法。下面分别从 Counter 所特有的方法和一些字典的常规方法来介绍。Counter 特有的方法Counter 额外支持字典中没有的三个方法elements()、most_common([m])以及subtract([iterable-or-mapping])。elements 方法elements()方法返回一个迭代器可以通过 list 或者其它方法将迭代器中的元素输出输出的结果为对应出现次数的元素。from collections import Counterc Counter({a:1, b:2, c:3})c2 Counter({a:0, b:-1, c:3}) # 将出现次数设置为 0 和负值 print(c.elements())0x0000022A57509B70 print(list(c.elements()))[a, b, b, c, c, c] print(c2.elements())0x0000022A57509B70 print(list(c2.elements()))[c, c, c]在 Counter 中是允许计数为 0 或者负值的不过通过上面代码可以看出 elements 函数没有将 0 和负值对应的元素值打印出来。most_common 方法most_common([n])是 Counter 最常用的方法返回一个出现次数从大到小的前 n 个元素的列表。from collections import Counterc Counter({a:1, b:2, c:3}) print(c.most_common()) # 默认参数[(c, 3), (b, 2), (a, 1)] print(c.most_common(2)) # n 2 [(c, 3), (b, 2)] print(c.most_common(3)) # n 3[(c, 3), (b, 2), (a, 1)] print(c.most_common(-1)) # n -1[]n为可选参数通过上面的代码可以总结出不输入n默认返回所有输入n小于最长长度则返回前n个数输入n等于最长长度则返回所有输入n -1则返回空subtract 方法subtract([iterable_or_mapping])方法其实就是将两个 Counter 对象中的元素对应的计数相减。from collections import Counterc Counter({a:1, b:2, c:3})d Counter({a:1, b:3, c:2, d:2})c.subtract(d) print(c)Counter({c: 1, a: 0, b: -1, d: -2})其实就是两个 Counter 中的对应的元素的计数相减。当其中某个 Counter 中对应的元素不存在的时候默认将其计数设置为 0这也是为什么d的计数为-2的原因。Counter 支持的字典方法一般常规的字典方法对 Counter 对象都是有效的将这些字典方法作用到下面的 Counter 对象c中并绘制到下面的表格中。from collections import Counterc Counter({a:1, b:2, c:3, d:0, e:-1})方法描述结果c.values()列出所有的元素的计数dict_values([1, 2, 3, 0, -1])c.clear()清空所有元素Counter() # 元素为空的 Counterlist(c)列出所有不唯一的元素[a, b, c, d, e]set(c)转换成集合{d, b, c, a, e}dict(c)转换成字典{a: 1, b: 2, c: 3, d: 0, e: -1}c.items()转换成dict_items其中的元素为(key, vlaue)dict_items([(a, 1), (b, 2), (c, 3), (d, 0), (e, -1)])c.most_common()[:-n-1:-1]n 个出现次数最小的元素[(e, -1), (d, 0)] # 当 n 2 时c Counter()删除掉计数为 0 和复数的元素Counter({c: 3, b: 2, a: 1})但是在 Counter 中有两个方法和字典中的使用有些区别异常方法描述fromkeys(iterable)没有为 Counter 对象实现该函数update([iterable-or-mapping])增加 count 而不是用新的 count 取代旧的 countfrom collections import Counterc Counter({a:1, b:2, c:3, d:0, e:-1})c.update({a:2, d:2, e:1}) print(c)Counter({a: 3, c: 3, b: 2, d: 2, e: 0})对于 Counter 中的update函数简单来说就是增加对应元素的计数。集合运算符这里直接贴出集合运算符的代码示例。 c Counter(a3, b1) d Counter(a1, b2) c d # add two counters together: c[x] d[x]Counter({a: 4, b: 3}) c - d # subtract (keeping only positive counts)Counter({a: 2}) c d # intersection: min(c[x], d[x])Counter({a: 1, b: 1}) c | d # union: max(c[x], d[x])Counter({a: 3, b: 2})参考https://blog.csdn.net/Shiroh_ms08/article/details/52653385推荐阅读(点击标题可跳转阅读)【自然语言处理】带你理解语言模型【自然语言处理】通俗理解n-gram语言模型【自然语言处理】通俗讲解语言模型的评价指标-困惑度【Python语言】轻松搞懂Python中Iterable与Iterator【机器学习】一文搞懂简单线性回归【深度学习】详解Softmax函数【技术干货】本地远程访问Linux服务器上的jupyter notebook【数据分析】Numpy中常用随机函数的总结