Numpy函数获取对应于给定值的分位数

Numpy function to get the quantile that corresponds to a given value

我看到很多 questions 这样的 R 语言,但我找不到专门针对 Python 的语言,最好使用 numpy。

假设我在 x 中存储了一组观察结果。我可以获得累积 q * 100% 人口的价值。

# Import numpy
import numpy as np

# Get 75th percentile
np.quantile(a=x, q=0.75)

但是,我想知道是否有一个函数可以执行相反的操作。也就是说,一个 numpy 函数,它以一个值作为输入并且 returns q.

为了进一步扩展这一点,scipy 分布对象有一个 ppf 方法可以让我这样做。我在 numpy 中寻找类似的东西。存在吗?

如果对 x 进行排序,则索引 i 处的值是 i / len(x) 百分位数(大约取决于您要如何处理边界条件)。如果 x 未排序,您可以通过将 x.argsort().argsort()[i] 替换为 i 来获得相同的值(或者先对 x 进行排序)。由于 argsort 是它自己的倒数,双参数排序告诉您原始数组的每个元素将落在排序数组中的哪个位置。

如果您想查找不一定在 x 中的任意值的结果,您可以将 np.searchsorted 应用于 x 的排序版本并对结果进行插值。您可以使用更复杂的方法,例如将样条曲线拟合到已排序的数据或类似的方法。

有一个方便的函数可以执行此操作。请注意,它不是精确的逆函数,因为 quantile/percentile 函数不精确。给定一组有限的观察值,百分位数将具有离散值;换句话说,您可能会指定一个介于这些值之间的 q,并且函数会找到最接近的值。

from scipy import stats
import numpy as np

stats.percentileofscore(np.arange(0,1,0.12), .65, 'weak') / 100

不是现成的函数,而是一个紧凑且相当快速的片段:

(a<value).mean()

您可以(至少在我的机器上)通过使用 np.count_nonzero

来提高几个百分点的性能
np.count_nonzero(a<value) / a.size

但老实说我什至不会打扰。