python - 矩阵扫描中的三重 for 循环

标签 python numpy for-loop matrix

正如标题中所说,我实际上在我的 python 程序中使用三重 for 循环来处理一个名为 A 的 numpy 矩阵,而且正如我们所料,它非常慢。 我有一个我们将称之为“return_bool”的函数,它返回一个 bool 值函数参数 h 和 i 和 j 矩阵元素的索引。我想将这个函数用于 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,y2,hh,hh2)
    equdroite2 = eqdroite(y1droite,y2droite,hhdroite,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,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(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,i,j) 以逐行处理矩阵 (return_bool(h,i)),使用这种方法需要 2.5 秒而不是 416 秒,所以问题是解决 i猜测。 我用了“&”和“|”使我的逻辑方程适应整条线。 感谢大家的帮助。

关于python - 矩阵扫描中的三重 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44756357/

相关文章:

python - 在 Pandas Dataframe 中搜索动态单词数

Python 三元组到元组

python - 从列表生成邻接矩阵,其中邻接表示元素相等

numpy - 通过在 Numpy 或类似工具中进行平均来缩小 3D 矩阵

java - java中的无限while循环和循环错误计数

javascript - 为什么这个函数返回一个空数组?

python - NetBox 安装期间出错,无法使用 manage.py 创建 super 用户

python - 如何通过匹配字典值将二级列标题/索引添加到数据框?

python-3.x - Python : Running nested loop, 2D 移动窗口,并行

javascript - 如何让月份名称显示在循环返回中