我在分析一些非常密集的数字时间测量。我想得到平均值、标准差等。有些输入很大,所以我想我可以避免创建数百万个数字的列表,而是使用Python集合。计数器对象作为紧凑的表示。
例如:我的一个小输入产生了一个类似[(48, 4082), (49, 1146)]
的collection.Counter
,这意味着值48出现了4,082次,值49出现了1,146次。对于这个数据集,我手动计算平均值为48.2192042846。
当然,如果我有一个简单的4,082 + 1,146 = 5,228个整数的列表,我只需要将其提供给numpy.mean()。
我的问题是:如何从collections.Counter
对象中的值计算描述性统计数据,就像我有一个数字列表一样?我必须创建完整的列表还是有快捷方式?
3条答案
按热度按时间uqcuzwp81#
collections.Counter()
是dict
的子类。只需使用Counter().values()
来获取计数列表,您可以使用标准库staticstics.mean()
函数请注意,我没有在这里调用
Counter.most_common()
,这将生成您在问题中发布的(key, count)
元组列表。如果必须使用
Counter.most_common()
的输出,可以使用生成器表达式过滤掉计数:如果你想计算平均值 key value,并通过它们的计数进行加权,你可以直接从计数器值中进行自己的计算:
注意:我在这里使用了
Counter.total()
,这是Python 3.10中的新特性。在旧版本中。使用sum(counter.values())
。对于中位数,使用
statistics.median()
:或者,对于
key * value
:ttygqcqt2#
虽然您可以在创建一个值列表后将所有内容卸载到
numpy
,但这将比所需的速度慢。相反,您可以使用您需要的实际定义。平均值就是所有数字的总和除以它们的计数,所以这很简单:
标准差稍微复杂一点。它是方差的平方根,而方差又被定义为集合的“平方均值减去均值的平方”。苏...
多一点手工工作,但如果数字集有很多重复,也应该快得多。
ejk8hzay3#
除非你想写自己的统计函数,否则没有现成的解决方案(据我所知)。
所以最后你需要创建列表,最快的方法是使用numpy。一种方法是:
UPDATE:从现有的collections.Counter()对象中创建元素