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

wgxvkvu9  于 2023-10-19  发布在  其他
关注(0)|答案(4)|浏览(98)

我看到很多像这样用于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方法允许我这样做。我在找类似的东西。它存在吗?

cgh8pdjw

cgh8pdjw1#

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

(a<value).mean()

您可以(至少在我的机器上)通过使用np.count_nonzero来挤出几个百分点的性能提升

np.count_nonzero(a<value) / a.size

但我根本不想麻烦你

bd1hkmkf

bd1hkmkf2#

有一个方便的功能可以做到这一点。请注意,它不是精确的逆,因为quantile/percentile函数不是精确的。给定一个有限的观测数组,这些值将具有离散值;换句话说,您可能指定了一个介于这些值之间的福尔斯q,函数会找到最接近的值。

from scipy import stats
import numpy as np

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

atmip9wb3#

如果x是排序的,索引i处的值是i / len(x)百分位数(或左右,取决于您想要如何处理边界条件)。如果x未排序,则可以通过将x.argsort().argsort()[i]替换为i(或先对x进行排序)来获得相同的值。因为argsort是它自己的逆,所以双argsort告诉你原始数组的每个元素在排序数组中的位置。
如果你想找到任意值的结果,而不一定是在x中,你可以将np.searchsorted应用于x的排序版本,并对结果进行插值。您可以使用更复杂的方法,例如将样条曲线拟合到已排序的数据或类似的方法。

g52tjvyc

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])更安全,因为相同的值会得到相同的分位数位置。

import numpy as np

def get_quant(x):
  " for each value in x, return which quantile it corresponds to "
  return np.array([np.count_nonzero(x<x_i)/(len(x)-1) for x_i in x])

注意:(x.size-1)分位数确保分位数值的范围为0到1(含0和1)。省略-1意味着永远不会达到100%分位数。

相关问题