我正在处理一个非常大的列表(~1GB)的旅行时间,并且我试图对它们进行平均,但是有一个怪癖,如果行程不可能,则将值设置为可能的最大整数值,这会破坏整个计算。旅行时间存储在一个列表中,列表在字典中。
从A点到B点,从B点到C点看起来像:
{'AB':[3,5,10],'BC':[2,3,5,10,2147483647]}
AB之间的平均值应为6,BC应为5(不是429496733.4)。
如何从平均计算中排除恶意值?
答案 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)]