向量化(python)代码,用于计算按阈值划分的范围

时间:2018-08-28 09:47:29

标签: python arrays performance for-loop vector

我想总结小于阈值的范围的数量(有时是局部的)。我在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)

0 个答案:

没有答案