给定一个真实数字的列表,例如
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
或某些bisect
或其他方式进行操作?
假设输入列表始终是分类的。
也许是这样的东西?
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
x = np.arange(20)
Percent = 25
CumSumArray = np.cumsum(x)
ValueToFind = CumSumArray[-1] * Percent / 100
Idx = np.argmax(CumSumArray > ValueToFind)[0] - 1
遵循此提示,可以使用搜索搜索来找到元素的索引,该元素接近(较低(至百分位/分数值。
请参阅下面的示例:
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
进行排序。