numpy percentile采用nearest插值结果与维基定义不符是否为bug?
numpy.percentile与最近秩方法结果差异说明
这不属于numpy的bug,二者结果差异来自百分位数的多种通用计算标准,numpy针对不同标准提供了对应的参数配置。
- 两种计算逻辑的核心区别
维基提到的最近秩(nearest-rank)方法采用1起始索引,秩计算公式为n = ceil(p/100 * N),其中N为数组总长度。示例中N=5,计算40百分位时:40/100 * 5 = 2,向上取整为2,对应数组第2个元素20,和维基结果一致。
numpy的interpolation='nearest'参数采用0起始索引,索引计算公式为idx = round(p/100 * (N - 1))。示例中40/100 * (5-1) = 1.6,四舍五入得到索引2,对应数组第3个元素35,与实际运行结果一致。 - 匹配最近秩方法的正确用法
numpy 1.22及以上版本新增了method参数用于指定百分位数计算标准,直接设置method='nearest_rank'即可得到符合维基定义的结果,代码示例如下:import numpy as np arr = [15, 20, 35, 40, 50] p = 40 r = np.percentile(arr, p, method='nearest_rank') print(r) # 输出结果为20 - 设计背景说明
百分位数不存在唯一的通用计算标准,不同领域有各自沿用的计算规范,学术研究中曾归纳出9种广泛使用的百分位数实现方法。numpy默认逻辑仅对应其中一种,用户可根据需求选择对应参数,不存在计算错误。
内容的提问来源于stack exchange,提问作者caravan eat
相关产品推荐
相关产品推荐

