Python 有没有办法从排序列表中获取累积和百分比的索引?
给定一个实数排序列表,例如Python 有没有办法从排序列表中获取累积和百分比的索引?,python,list,numpy,percentage,cumulative-sum,Python,List,Numpy,Percentage,Cumulative Sum,给定一个实数排序列表,例如 x = range(20) 任务是找到列表累积和的X%的第一个索引,例如 def compute_cumpercent(lint, percent): break_point = sum(lint) * percent mass = 0 for i, c in enumerate(lint): if mass > break_point: return i mass += c 要
x = range(20)
任务是找到列表累积和的X%的第一个索引,例如
def compute_cumpercent(lint, percent):
break_point = sum(lint) * percent
mass = 0
for i, c in enumerate(lint):
if mass > break_point:
return i
mass += c
要查找输入列表中小于且接近累计总和25%的数字索引
>>> compute_cumpercent(x, 0.25)
11
首先,这样一个函数有数学/名称吗
除了使用上面的简单循环外,还有没有其他方法可以使用numpy或一些对分或其他方法来实现同样的操作
假设输入列表总是排序的 也许是这样的
import numpy as np
x = range(20)
percent = 0.25
cumsum = np.cumsum(x)
break_point = cumsum[-1] * percent
np.argmax(cumsum >= break_point) + 1 # 11
接下来,可以使用查找元素的索引,该索引接近百分位/分位数值
见下例:
import numpy as np
def find_index_left(xs, v):
return np.searchsorted(xs, v, side='left') - 1
def find_index_quantile(xs, q):
v = np.quantile(xs, q)
return find_index_left(xs, v)
xs = [5, 10, 11, 15, 20]
assert np.quantile(xs, 0.9) == 18.0
assert find_index_left(xs, 18) == 3 # zero-based index for forth element
assert find_index_quantile(xs, 0.9) == 3
注意xs必须进行排序。有没有这个名称?我不知道,因为我是一名Ruby web开发人员,所以没有太多说明\_ツ_/''哦,实际上这很棘手,尝试%1.0,你会看到一个惊喜。@Alva如果你使用>=而不是>,答案将是预期的20。这是不是不一样。不是百分位数。
import numpy as np
def find_index_left(xs, v):
return np.searchsorted(xs, v, side='left') - 1
def find_index_quantile(xs, q):
v = np.quantile(xs, q)
return find_index_left(xs, v)
xs = [5, 10, 11, 15, 20]
assert np.quantile(xs, 0.9) == 18.0
assert find_index_left(xs, 18) == 3 # zero-based index for forth element
assert find_index_quantile(xs, 0.9) == 3