给定百分位数的变量累积和

5
我希望能够计算出给定百分位数之前的数组中所有值的总和。 例如:
import numpy as np
a = [15, 40, 124, 282, 914, 308]
print np.percentile(a,90)

第90个百分位数约为611,累积和到此为461。
在Python中有没有可以实现这个功能的函数?
3个回答

5
import numpy as np
a = np.array([15, 40, 124, 282, 914, 308])
b = np.cumsum(a)
p90 = np.percentile(a, 90)
print b[b < p90][-1] #461

1
由于cumsum数组根据定义已排序,因此您可以搜索排序百分位值。 - Jaime
谢谢!特别感谢有关哪种解决方案在哪种情况下可能更快的有用评论... - user308827

4
我不知道有没有类似的解决方法,但是你可以这样做。
import numpy as np
from itertools import takewhile

a = [15, 40, 124, 282, 914, 308]
p90 = np.percentile(a,90)
print sum(takewhile(lambda x : x < p90,  a))

输出:

461

4
A=np.array(a)
A[:(A<np.percentile(a, 90)).argmin()].sum() #461

@JoshAdel's

%%timeit
    ...: b = np.cumsum(a)
    ...: p90 = np.percentile(a, 90)
    ...: b[b < p90][-1]
    ...: 
1000 loops, best of 3: 217 µs per loop

This:

%timeit A[:(A<np.percentile(a, 90)).argmin()].sum()
10000 loops, best of 3: 191 µs per loop

+1 不错的解决方案。我要说,在我的机器上,对于给定的系统大小,我的代码稍微快一些。然而,对于更大的数组,根据组成情况,你的代码可能会稍微(5-10%)更快。 - JoshAdel
我还要补充一点,在我的机器上,对于一个大的随机数组,itertools 的解决方案比 numpy 的解决方案稍微快一些。对于小数组来说,速度会慢一些。再次强调,这只是在我的机器上测试的结果,实际情况可能会有所不同。我将让 OP 自行决定什么对于他们特定的硬件/数组组合最好。 - JoshAdel
非常有趣,Josh。我刚刚发现itertools总是比我们中的任何一个都稍微快一点。我在win32平台上安装了MKL,但我不确定这些操作是否会使用它。对于那些了解内部运作的人来说,这是一些有用的信息。 - CT Zhu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接