我正在分析一些非常密集的数字时间测量.我想获得平均值,标准偏差等一些投入都很大,所以我想我会避免造成数以百万计的数字列表,而是使用Python collections.Counter对象作为一个紧凑的表示.
示例:我的一个小输入产生collection.Counter类似值[(48, 4082), (49, 1146)],这意味着值48的4,082次出现和值49的1,146次出现.对于此数据集,我手动计算平均值为48.2192042846.
当然,如果我有一个简单的4,082 + 1,146 = 5,228个整数列表,我会把它提供给numpy.mean().
我的问题:如何从collections.Counter对象中的值计算描述性统计数据,就像我有一个数字列表一样?我是否必须创建完整列表或是否有快捷方式?
collections.Counter()是.的子类dict.只需使用Counter().values()获取计数列表:
counts = Counter(some_iterable_to_be_counted)
mean = numpy.mean(counts.values())
Run Code Online (Sandbox Code Playgroud)
请注意,我并没有叫Counter.most_common()这里,将产生的名单(key, count),你在你的问题发布的元组.
如果必须使用输出,则Counter.most_common()可以使用列表推导过滤掉计数:
mean = numpy.mean([count for key, count in most_common_list])
Run Code Online (Sandbox Code Playgroud)
如果您正在使用Python 3(其中dict.values()返回字典视图),您可以传入list(counts.values()),或使用标准库staticstics.mean()函数,该函数采用可迭代(包括dict.values()字典视图).
如果您打算将平均键值计算为按其计数加权,则可以直接从计数器值进行自己的计算.在Python 2中,它是:
from __future__ import division
mean = sum(key * count for key, count in counter.iteritems()) / sum(counter.itervalues())
Run Code Online (Sandbox Code Playgroud)
该from __future__进口应该在你的模块的顶部,并确保您不会遇到大的浮点数溢出的问题.在Python 3中,它被简化为:
mean = sum(key * count for key, count in counter.items()) / sum(counter.values())
Run Code Online (Sandbox Code Playgroud)
中位数可以用二分法计算; (key, count)按键对对进行排序,对计数求和,并将中间点平分为计数的累计和.插入点的索引指向排序键列表中的中间键.
虽然您可以numpy在列出值后卸载所有内容,但这会比所需的要慢。相反,您可以使用您需要的实际定义。
平均值只是所有数字的总和除以它们的数量,所以这很简单:
sum_of_numbers = sum(number*count for number, count in counter.items())
count = sum(count for n, count in counter.items())
mean = sum_of_numbers / count
Run Code Online (Sandbox Code Playgroud)
标准偏差有点复杂。它是方差的平方根,而方差又被定义为您的集合的“平方均值减去均值的平方”。呜呜……
total_squares = sum(number*number * count for number, count in counter)
mean_of_squares = total_squares / count
variance = mean_of_squares - mean * mean
std_dev = math.sqrt(variance)
Run Code Online (Sandbox Code Playgroud)
多一点手动工作,但如果数字集有很多重复,也应该快得多。
| 归档时间: |
|
| 查看次数: |
5478 次 |
| 最近记录: |