使用Numpy找到给定值的百分位数%。

11

可能有更好的词来描述这个问题,但是我想做的是与np.percentile()相反的操作。我有一个包含n个数字的列表,并且我想知道它们中有多少百分比小于给定值。现在我得到这个值的方法是不断尝试不同的小数。 我想要 Numpy 告诉我:

给定阈值=0.20(输入),列表d中约99.847781%(输出)的项目低于此百分位。

我现在所做的获取这个数字的方法非常靠不住:

>>> np.percentile(np.absolute(d), 99.847781)
0.19999962082827874

>>> np.percentile(np.absolute(d), 99.8477816)
0.19999989822334402

>>> np.percentile(np.absolute(d), 99.8477817)
0.19999994445584851

>>> np.percentile(np.absolute(d), 99.8477818)
0.19999999068835939
...

1
你正在寻找 sum(d < given_value) / len(d) 吗?如果你使用的是 python2,你需要将其中一个操作数转换为 float - pault
4
这个?https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.percentileofscore.html#scipy.stats.percentileofscore - Mr. T
3个回答

16
如果我正确理解了你的问题,那么类似如下内容:
sum(d < threshold) / len(d)

应该去做。

编辑:我在问题中漏掉了绝对值符号 -

sum(np.abs(d) < threshold) / float(len(d))

我把你的代码修改成了Python函数式的,但是你的想法是正确的!我想我忘记了一些基础知识!谢谢。 - cookiedough
1
@cookiedough,你的编辑与此处发布的内容不等价。如果你想要绝对值,请执行 sum(np.absolute(d) < 0.2) / float(len(d)) - pault
如果d是一个numpy数组,我给出的代码是有效的Python代码(假设您正在使用Python3)。 - Tim

3
假设d是一个NumPy数组,在一般情况下,您可以这样做:
(d < threshold).mean()

对于绝对值的计算,具体如下:

(np.abs(d) < threshold).mean()

0
其他答案都很好。但是如果数组中的某些值可能与阈值相同(例如,整数数组),这个技巧可以处理这种情况:
( (d < threshold).mean() + (d <= threshold).mean() ) / 2

只是平均使用小于和小于等于。

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