什么是numpy.percentile,如何使用它来分割数组?

3

我正在尝试理解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%的值<4.5459?
  • 数组中5%的值<-3.41043?

这样读取是否正确?

我想将numpy数组拆分为小的子数组。 我想基于元素的百分位出现次数来执行此操作。 我该如何做到这一点?


什么是最小的子数组?您想如何根据百分位数拆分元素? - Hossein
你的假设基本上是正确的(尽管我会用“小于或等于”代替“低于”)。5%值不在实际数组中的原因是使用了一些插值。插值类型可以通过使用参数进行设置,请参阅文档。 - user707650
2个回答

2
不,正如你可以通过检查看到的那样,你数组中仅有75%的值严格小于4.5459,而25%的值严格小于-3.41043。如果你写成小于或等于,则会给出一个“百分位数”的共同定义,但这也不是适用于你的情况的定义;相反,发生的事情是numpy应用了一种插值方案,以确保将[0,100]中给定数字映射到相应百分位数的映射是连续和分段线性的,同时在对应于给定数组中的值的排名时仍然给出“正确”的值。事实证明,即使这一点,你也可以用许多不同的方式来完成,所有这些方式都是合理的,正如维基百科上该主题的文章所描述的那样。正如你在numpy.percentile的文档中所看到的那样,你可以控制插值行为,并且默认情况下它使用维基百科文章称为“第二变量,C = 1”的方法。

也许最容易理解其影响的方法是简单绘制计算固定长度4数组的不同np.percentile值的结果:

enter image description here

请注意,kinks均匀分布在[0,100]上,与你数组中实际值对应的百分位数由在0 * 100 /(4-1),1 * 100 /(4-1),2 * 100 /(4-1)和3 * 100 /(4-1)处评估lambda p:np.percentile(nd_array,p)给出。


2
更准确地说,你应该说 a = np.percentile(arr, q) 表示 近似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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接