我试图理解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]
百分位数值意味着什么?
这是阅读这些内容的正确方法吗?
我想将numpy数组拆分成小的子数组。我想根据元素的百分位数来做到这一点。我怎么能这样做?
答案 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
的不同值的结果:
注意扭结如何在[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