Python numpy.percentile是什么意思?如何使用它分割数组?
我试图理解numpy的百分位数Python numpy.percentile是什么意思?如何使用它分割数组?,python,numpy,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
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]
百分位值是什么意思
- 数组中100%的值小于4.5459
- 数组中5%的值小于-3.41043
我想把numpy数组分割成几个小的子数组。我想根据元素的百分位发生率来做。如何执行此操作?不,正如您通过检查所看到的,数组中只有75%的值严格小于4.5459,25%的值严格小于-3.41043。如果你写的小于或等于,那么你会给出“百分位数”的一个通用定义,但碰巧也不是你的案例中所适用的定义;相反,
numpy
正在应用某种插值方案,以确保将[0,100]中的给定数字映射到相应的百分位数是连续的、分段线性的,同时在与给定数组中的值相对应的列组中仍然给出“右”值。事实证明,即使是这样,你也可以用许多不同的方法来做,所有这些方法都是合理的,如中所述。正如您在中所看到的,您可以控制插值行为,默认情况下,它使用维基百科文章所称的“第二个变量,$C=1$”
理解这一含义的最简单方法可能是简单地绘制计算固定长度4数组的np.percentile
不同值的结果:
请注意扭结是如何均匀分布在[01100]上的,并且与数组中的实际值相对应的百分位数是通过分别在0*100/(4-1)、1*100/(4-1)、2*100/(4-1)和3*100/(4-1)处计算
lambda p:np.百分位数(nd_数组,p)
(arr,q)表示arr
元素的几乎q%
低于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
你所说的最小子数组是什么意思?你想如何基于百分位数分割元素?你的假设基本上是正确的(尽管我将“低于”替换为“低于或等于”)。5%值不在实际数组中的原因是使用了一些插值。可以使用参数设置插值类型,请参阅文档。
>>> 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