Я хочу суммировать количество (и иногда частичные) диапазонов, которые меньше порогового значения. Я повторяю этот процесс j раз в цикле for.
Число [j] является целым числом и является количеством диапазонов, которые полностью или частично располагаются слева от порога [j].
n_alpha [j] - действительное значение, ограниченное сверху числом [j]. n_alpha [j] записывает частичную величину диапазона, которая ниже порогового значения этой долей (thres - min) / (max-min). Обратите внимание, что если диапазон полностью ниже порогового значения, то вклад равен 1. Если диапазон полностью превышает пороговое значение, то вклад равен 0.
В настоящее время я разделяю массив, содержащий диапазоны, проверяя, является ли min меньше порогового значения. (Номер это число [j]).
Затем я снова разделяю этот массив, проверяя, не превышает ли max порог. Эти диапазоны затем перекрывают порог. (Разница в длине между этими двумя массивами - это количество диапазонов, которые находятся полностью ниже порогового значения и которые образуют начало n_alpha [j], при этом каждый полностью включенный диапазон считается как + 1.
Я заканчиваю вычисление n_alpha [j] суммированием по долям диапазонов, которые находятся между собой.
Есть 2 способа ускорить это. Во-первых, удаление петли j. Во-вторых, нужно воспользоваться тем, что каждый диапазон сортируется по его левой конечной точке (pmin) и что также сортируются пороги, которые мы повторяем в течение j раз. На практике существуют десятки тысяч диапазонов (и пороговые значения для проверки).
import numpy as np
pmin = [.01,.1,.2,.22,.3] #these are sorted
pmax = [.7, .5,.4,.23,.6] #these may not be!!
pv_sort_min = np.column_stack((pmin, pmax)) #now one array with ranges as entry
#print(pv_sort_min)
#these are the thresholds
alpha_to_check = np.array([.001, .1, .25, .3, .35, .4, .5, .6, .7])
number = np.zeros(len(alpha_to_check))
n_alpha = np.zeros(len(alpha_to_check))
#the loop
for j in range(0, alpha_to_check.shape[0]):
pv_inc = pv_sort_min[pv_sort_min[:,0] < alpha_to_check[j]]
number[j] = len(pv_inc)
pv_strad = pv_inc[pv_inc[:,1] > alpha_to_check[j]]
n_alpha[j] = len(pv_inc) - len(pv_strad) #just the start!
partials = np.divide((alpha_to_check[j]-pv_strad[:,0]),(pv_strad[:,1]-pv_strad[:,0]))
n_alpha[j] += np.sum(partials)
print("pv_inc \n", pv_inc)
print("number", number)
print("pv_strad \n", pv_strad)
print("n_alpha", n_alpha)