python – 矩阵扫描中的三重循环
发布时间:2020-12-20 13:18:12 所属栏目:Python 来源:网络整理
导读:正如标题中所说,我实际上正在使用三重for循环来处理我的 python程序中名为A的numpy矩阵,正如我们所预料的那样,它非常慢. 我有一个函数,我们将调用“return_bool”,它返回参数h和i的函数的布尔值,以及矩阵元素的索引.我想将这个函数用于h的几个值来制作一种“
正如标题中所说,我实际上正在使用三重for循环来处理我的
python程序中名为A的numpy矩阵,正如我们所预料的那样,它非常慢.
我有一个函数,我们将调用“return_bool”,它返回参数h和i的函数的布尔值,以及矩阵元素的索引.我想将这个函数用于h的几个值来制作一种“梯度矩阵”. 这是我的代码: A = np.zero(iindex,jindex) for h in hvalue: for in iindex: for j in jindex: if (return_bool(h,i,j) : A[i][j] =+ 1 有没有提高矩阵扫描速度的提示? 这是我的“return_bool”函数的代码(所有值都是float或者带有x和y点的点(x,y)): def inclu_geo(coord1,coord2,y1,y2,hh,hh2,y1droite,y2droite,hhdroite,hh2droite,intersec1,intersec2,rho): global y global yprime global largeur_pale #equation des droites equdroite1 = eqdroite(y1,hh2) equdroite2 = eqdroite(y1droite,hh2droite) if 0< rho < 90 : if (intersec1!=(0,0) or intersec2!=(0,0))and(inclu(intersec1[0],intersec1[1]) or inclu(intersec2[0],intersec2[1])): if inclu(intersec1[0],intersec1[1]): b = ((y<=coord1<=y1)and(hh2<=coord2<=hh))or((intersec1[0]<=coord1<=yprime)and(hh2<=coord2<=intersec1[1]))or((y1<=coord1<=intersec1[0])and(hh2<=coord2<=(equdroite1[0]*coord1+equdroite1[1]))) if inclu(intersec2[0],intersec2[1]): b = ((y<=coord1<=intersec2[0])and(hh2droite<=coord2<=intersec2[1]))or((y1droite<=coord1<=yprime)and(hh2droite<=coord2<=hhdroite))or((intersec2[0]<=coord1<=y1droite)and(hh2<=coord2<=(equdroite2[0]*coord1+equdroite2[1]))) else: if (hh != 0) and inclu(y1,hh): b = ((y<=coord1<=y1)and(hh2<=coord2<=hh))or((y1<=coord1<=y2)and(hh2<=coord2<=(equdroite1[0]*coord1+equdroite1[1]))) elif (hhdroite != 0) and inclu(y1droite,hhdroite): b = ((y1droite<=coord1<=yprime)and(hh2droite<=coord2<=hhdroite))or((y2droite<=coord1<=y1droite)and(hh2<=coord2<=(equdroite2[0]*coord1+equdroite2[1]))) elif (hhdroite != 0) or (hh != 0): b = True else: b = False else: if (intersec1!=(0,intersec2[1])): if inclu(intersec1[0],intersec1[1]): b = ((y<=coord1<=y1)and(hh<=coord2<=hh2))or((intersec1[0]<=coord1<=yprime)and(intersec1[1]<=coord2<=hh2))or((y1<=coord1<=intersec1[0])and((equdroite1[0]*coord1+equdroite1[1])<=coord2<=hh2)) if inclu(intersec2[0],intersec2[1]): b = ((y<=coord1<=intersec2[0])and(intersec2[1]<=coord2<=hh2droite))or((y1droite<=coord1<=yprime)and(hhdroite<=coord2<=hh2droite))or((intersec2[0]<=coord1<=y1droite)and((equdroite2[0]*coord1+equdroite2[1])<=coord2<=hh2)) else: if (hh != largeur_pale) and inclu(y1,hh): b = ((y<=coord1<=y1)and(hh<=coord2<=hh2))or((y1<=coord1<=y2)and((equdroite1[0]*coord1+equdroite1[1])<=coord2<=hh2)) elif (hhdroite != largeur_pale) and inclu(y1droite,hhdroite): b = ((y1droite<=coord1<=yprime)and(hhdroite<=coord2<=hh2droite))or((y2droite<=coord1<=y1droite)and((equdroite2[0]*coord1+equdroite2[1])<=coord2<=hh2)) elif (hhdroite != largeur_pale) or (hh != largeur_pale): b = True else: b = False return b 解决方法
我重写了我的return_bool(h,j)来逐行处理矩阵(return_bool(h,i)),用这种方法需要2.5秒而不是416秒,所以问题解决了我猜. 我用过“&”和“|”使我的逻辑方程适应整行. 感谢大家的帮助.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |