Векторизованный (python) код для подсчета диапазонов, разделенных порогом - PullRequest
0 голосов
/ 28 августа 2018

Я хочу суммировать количество (и иногда частичные) диапазонов, которые меньше порогового значения. Я повторяю этот процесс 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...