根据我的理解,numpy's percentile计算数据的第q个百分位数。
但它究竟是怎么做的?
说,给定x = np.array([1.3, 1.7, 2.4, 2.8, 3.5, 5.6, 6.6, 7.7, 8.8, 9.9])
(里面有10个花车)。
如果我np.percentile(x, 100)
,则会返回9.9000000000000004
。
如果我np.percentile(x, 90)
,它应该返回8.8
,对吧?但它会回复8.9100000000000001
。
为什么会有这样的差异?这些差异是否可以接受?
答案 0 :(得分:3)
从版本1.9.0开始,Numpy的百分位函数有一个interpolation
参数,如下所示in the docs:
插值:{'线性','下','更高','中点','最近'} 当所需的分位数位于两个数据点i和j之间时,此可选参数指定要使用的插值方法:
- 线性:i +(j - i)*分数,其中分数是由i和j包围的索引的小数部分。
- lower:i。
- 更高:j。
- nearest:i或j以最近的为准。
- 中点:(i + j)/ 2。
默认为线性。如果您想从示例中获取8.8
,请运行:
np.percentile(x, 90, interopolation='lower')
答案 1 :(得分:2)
根据我的理解,90%-percentile不必是输入数组中的项目。
给定长度为N的向量V,V的第q个百分位数是V的排序副本中的第q个排名值。两个最近邻居的值和距离以及插值参数将确定如果标准化排名与q完全不匹配,则为百分位数。如果q = 50,则此函数与中位数相同,如果q = 0,则与最小值相同,如果q = 100,则与最大值相同。
浮动表示的问题(导致np.percentile(x, 100)
与9.9
相比略有不同)是well known。