平均值不包括非常大的列表

时间:2017-03-19 03:17:58

标签: python python-3.x statistics mean

我正在处理一个非常大的列表(~1GB)的旅行时间,并且我试图对它们进行平均,但是有一个怪癖,如果行程不可能,则将值设置为可能的最大整数值,这会破坏整个计算。旅行时间存储在一个列表中,列表在字典中。

从A点到B点,从B点到C点看起来像:

{'AB':[3,5,10],'BC':[2,3,5,10,2147483647]}

AB之间的平均值应为6,BC应为5(不是429496733.4)。

如何从平均计算中排除恶意值?

2 个答案:

答案 0 :(得分:2)

statistics模块提供了一个mean()函数,它可以将迭代器作为输入,因此您不必复制列表来过滤掉要丢弃的值。 / p>

这是一个模拟的数据示例,其中100万个元素中的90%在1到9的范围内,10%是你的流氓价值:

from random import randint, random

data = [randint(1, 9) if random() < 0.9 else 2147483647 for _ in range(1000000)]

以下是使用statistics.mean()获取平均包括恶意值的方法:

>>> from statistics import mean

>>> mean(data)
215405499.193486

...以及如何对其进行迭代排除流氓值:

>>> mean(x for x in data if x != 2147483647)
4.998926301609214

将其包含在词典理解中:

>>> travel_times = {'AB':[3,5,10],'BC':[2,3,5,10,2147483647]}
>>> {k: mean(x for x in v if x != 2147483647) for k, v in travel_times.items()}
{'BC': 5, 'AB': 6}

答案 1 :(得分:0)

根据上面 user707650 的评论,这是一个利用 while(...){ cword *newcw = malloc(sizeof *newcw); if (newcw == NULL) { fprintf(stderr, "*** Error: Not enough memory.\n"); ... return EXIT_FAILURE; } newcw->nbocc = 1; newcw->iscommon = 0; if (hashtable_add(ht, s, newcw) == NULL) { ... return EXIT_FAILURE; } /*-----free(newcw);-----*/ } 并在计算平均值之前将每个列表转换为掩码数组的解决方案:

numpy

使用@zero-piraeus 回答中的大列表示例,我们可以看到执行时间的差异:

>>> import numpy as np

>>> travel_times = {'AB':[3,5,10],'BC':[2,3,5,10,2147483647]}

>>> {k: np.nanmean(np.ma.MaskedArray(v, mask=(np.array(v) == 2147483647))) 
   for k, v in travel_times.items()}

{'AB': 6.0, 'BC': 5.0}
from random import randint, random
from statistics import mean
import numpy as np

data = [randint(1, 9) if random() < 0.9 else 2147483647 for _ in range(1000000)]