我想总结小于阈值的范围的数量(有时是局部的)。我在for循环中重复此过程j次。
Number [j]是整数,是全部或部分位于阈值[j]左侧的范围数。
n_alpha [j]是一个以数字[j]为上限的实数值。 n_alpha [j]记录低于阈值的部分量(此阈值(阈值-最小)/(最大-最小))。请注意,如果范围完全低于阈值,则贡献为1。如果范围完全高于阈值,则贡献为0。
我目前正在通过检查min是否小于阈值来拆分包含范围的数组。 (此数字为数字[j])。
然后我再次拆分该数组,检查max是否大于阈值。这些范围将跨越阈值。 (这两个数组之间的长度差是完全低于阈值的范围数,并形成n_alpha [j]的开始,每个完全包含的范围都计为+1。
我通过对跨度范围的分数求和来完成n_alpha [j]计算。
有两种方法可以加快速度。首先是删除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)