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