numpy.percentile是什么意思以及如何使用它来分割数组?

时间:2017-03-19 06:47:23

标签: python numpy

我试图理解numpy中的百分位数。

import numpy as np
nd_array = np.array([3.6216, 4.5459, -3.5637, -2.5419])
step_intervals = range(100, 0, -5)

for percentile_interval in step_intervals:
    threshold_attr_value = np.percentile(np.array(nd_array), percentile_interval)
    print "percentile interval ={interval}, threshold_attr_value = {threshold_attr_value}, {arr}".format(interval=percentile_interval, threshold_attr_value=threshold_attr_value, arr=sorted(nd_array))

我得到的值为

percentile interval =100, threshold_attr_value = 4.5459, [-3.5636999999999999, -2.5419, 3.6215999999999999, 4.5458999999999996]

...

percentile interval =5, threshold_attr_value = -3.41043, [-3.5636999999999999, -2.5419, 3.6215999999999999, 4.5458999999999996]

百分位数值意味着什么?

  • 阵列中100%的值是&lt; 4.5459 <?/ LI>
  • 阵列中5%的值是&lt; -3.41043?

这是阅读这些内容的正确方法吗?

我想将numpy数组拆分成小的子数组。我想根据元素的百分位数来做到这一点。我怎么能这样做?

2 个答案:

答案 0 :(得分:2)

不,正如您通过检查所看到的,数组中只有75%的值严格小于4.5459,并且25%的值严格小于-3.41043。如果你写的小于或等于,那么你会给出一个共同定义的“百分位”,但是恰好也不适用于你的情况;相反,正在发生的是numpy正在应用某种插值方案以确保将[0,100]中的给定数字映射到相应的百分位数是连续的和分段线性的,同时仍然给出“正确的”值在与给定数组中的值对应的等级处。事实证明,即使你可以用许多不同的方式做,所有这些都是合理的,如Wikipedia article on the subject中所述。正如您在the documentation of numpy.percentile中所看到的,您可以控制插值行为,默认情况下它使用的是维基百科文章所称的“第二个变体,$ C = 1 $”。

理解其含义的最简单方法可能是简单地绘制计算固定长度为4的数组np.percentile的不同值的结果:

enter image description here

注意扭结如何在[0,100]上均匀分布,并且通过在0 * 100 /(4-1)处评估lambda p: np.percentile(nd_array, p)来给出与数组中实际值对应的百分位数,1 *分别为100 /(4-1),2 * 100 /(4-1)和3 * 100 /(4-1)。

答案 1 :(得分:1)

更准确地说,您应该说a = np.percentile(arr, q)表示q%几乎 arr元素低于a。为什么我要强调几乎

  • 如果q=100,则始终返回arr的最大值。因此,您不能说q%个元素“低于”a
  • 如果q=0,则始终返回arr的最小值。因此,您不能说q%个元素“低于或等于”a
  • 此外,返回值取决于插值的类型。

以下代码显示了插值参数的作用:

>>> import numpy as np
>>> arr = np.array([1,2,3,4,5])
>>> np.percentile(arr, 90) # default interpolation='linear'
4.5999999999999996
>>> np.percentile(arr, 90, interpolation='lower')
4
>>> np.percentile(arr, 90, interpolation='higher')
5