我看到很多像这样用于R的questions,但我找不到一个专门用于Python的,最好使用numpy。
假设我有一个存储在x
中的观察数组。我可以得到累积q * 100
人口百分比的值。
# Import numpy
import numpy as np
# Get 75th percentile
np.quantile(a=x, q=0.75)
然而,我想知道是否有一个函数可以做相反的事情。也就是说,numpy函数接受一个值作为输入并返回q
。
为了进一步扩展这一点,scipy分发对象有一个ppf
方法允许我这样做。我在找类似的东西。它存在吗?
4条答案
按热度按时间cgh8pdjw1#
不是一个现成的函数,而是一个紧凑且相当快的代码片段:
您可以(至少在我的机器上)通过使用
np.count_nonzero
来挤出几个百分点的性能提升但我根本不想麻烦你
bd1hkmkf2#
有一个方便的功能可以做到这一点。请注意,它不是精确的逆,因为
quantile
/percentile
函数不是精确的。给定一个有限的观测数组,这些值将具有离散值;换句话说,您可能指定了一个介于这些值之间的福尔斯q
,函数会找到最接近的值。atmip9wb3#
如果
x
是排序的,索引i
处的值是i / len(x)
百分位数(或左右,取决于您想要如何处理边界条件)。如果x
未排序,则可以通过将x.argsort().argsort()[i]
替换为i
(或先对x
进行排序)来获得相同的值。因为argsort
是它自己的逆,所以双argsort告诉你原始数组的每个元素在排序数组中的位置。如果你想找到任意值的结果,而不一定是在
x
中,你可以将np.searchsorted
应用于x
的排序版本,并对结果进行插值。您可以使用更复杂的方法,例如将样条曲线拟合到已排序的数据或类似的方法。g52tjvyc4#
虽然
vals = x.argsort().argsort()/(x.size-1)
在具有完全唯一值的数组中工作,但如果有重复的值,它就会失败。相同的值应该具有相同的分位数值,但例如,如果数组x
有200个零值和800个大于零的值,则此方法将为这些零值提供给予200个不同的分位数值。使用vals = np.array([np.count_nonzero(x<x_i)/(x.size-1) for x_i in x])
更安全,因为相同的值会得到相同的分位数位置。注意:
(x.size-1)
分位数确保分位数值的范围为0到1(含0和1)。省略-1
意味着永远不会达到100%分位数。