Python numpy.percentile()生成的输出与MATLAB prctile()不同

Python numpy.percentile()生成的输出与MATLAB prctile()不同,python,Python,Python生成的百分位数的值与MATLAB中的值不同 我在Python中使用了numpy.percentile,在MATLAB中使用了prctile Python: a = [ 4.17844459 3020.84958224 0. ] b = [20 50 80] c = [0, [0, 1, 2]] = np.percentile(a, b) [1.6713778362648797 4.178444590662199 1814.1811271801632] MA

Python生成的百分位数的值与MATLAB中的值不同

我在Python中使用了
numpy.percentile
,在MATLAB中使用了
prctile

Python:

a = [   4.17844459 3020.84958224    0.        ]
b = [20 50 80]
c = [0, [0,  1, 2]] = np.percentile(a, b)
[1.6713778362648797 4.178444590662199 1814.1811271801632]

MATLAB:
c(1, 1:3) = prctile(a, b)
[0.417844459066220 4.17844459066220 2719.18246847491]

我更喜欢MATLAB的答案,因为这来自于我试图用Python编写的原始代码。

在其核心,这是一个“示例”与“总体”的问题

NumPy将
a
视为代表整个人群,因此最低的元素是第0百分位,最高的元素是第100百分位,并以此为基础进行插值。插值默认为线性,但也有其他选项可用

相反,对于
n
-元素向量,Matlab将元素视为从
100*.5/n
第百分位到
100*(n-.5)/n
第百分位的范围,并以此为基础进行插值。当你只有一个样本时,这更适合于近似未知人群中的百分位数。插值是线性的,除了低于
100*.5/n
或高于
100*(n-.5)/n
的百分位数,其中Matlab分别返回最低或最高输入数据点

NumPy和Matlab都没有提供切换来获得相反的行为。如果您希望Matlab在Python中的行为,则必须对输入进行排序并手动执行插值,或者转换您要求的百分位数以撤销不同输入解释的效果:

def matlab_percentile(x, p):
    p = numpy.asarray(p, dtype=float)
    n = len(x)
    p = (p-50)*n/(n-1) + 50
    p = numpy.clip(p, 0, 100)
    return numpy.percentile(x, p)

这甚至不是语法上有效的Python。你是什么意思?尝试将“Python:”下的任何一行放入Python解释器,Python将报告一个语法错误。