Python 4用于循环优化

Python 4用于循环优化,python,python-3.x,numpy,optimization,Python,Python 3.x,Numpy,Optimization,我有以下极为丑陋的代码和平: def cell_hist(gradients): h, w, d = gradients.shape window_size = 8 res_h = int(h / window_size) res_w = int(w / window_size) bins_number = 9 bin_width = (180 / bins_number) bins = [bin_width * x for x in r

我有以下极为丑陋的代码和平:

def cell_hist(gradients):
    h, w, d  = gradients.shape
    window_size = 8
    res_h = int(h / window_size)
    res_w = int(w / window_size)
    bins_number = 9
    bin_width = (180 / bins_number)
    bins = [bin_width * x for x in range(bins_number)]
    result = np.zeros((res_h, res_w, bins_number))

    for a in range(res_h):
        for b in range(res_w):
            fragment = gradients[a*window_size:(a+1)*window_size, b*window_size:(b+1)*window_size]
            hist = np.zeros(bins_number)

            for row in fragment:
                for pixel in row:
                    nbin = int((pixel[1] // bin_width) % 9)
                    hist[nbin] += ((pixel[1] - bins[nbin]) / bin_width) * pixel[0]
                    if nbin != bins_number - 1:
                        hist[nbin+1] += ((bins[nbin+1] - pixel[1]) / bin_width) * pixel[0]
                    else:
                        hist[0] += ((180 - pixel[1]) / bin_width) * pixel[0]
            result[a,b] = hist
    return result
我知道这很糟糕,但我想不出任何优化方法来摆脱4 for循环。这里有没有什么棘手的numpy索引可能会有所帮助?我将非常感谢你的帮助


梯度参数是一个矩阵,如下所示:w,h,2。所以基本上是两个通道的图像

通过itertools和嵌套元素的组合,可以减少“内部选项卡式”操作

但在我看来,没有正确的方法

首先,让我们考虑一下您可以做些什么,将这段庞大的代码拆分为几个函数,在必要时相互调用,然后命名任何函数/部分,使其不仅不那么难看,而且可读性增强:

例如,我将其拆分为如下内容:

def单元梯度: h、 w,d=梯度。形状 窗口大小=8 res\u h=内部/窗口大小 res\u w=内部/窗口大小 垃圾箱数量=9 料仓宽度=180/料仓数量 箱柜=[箱柜宽度*x代表范围内的x箱柜数量] 结果=np.zerosres\u h、res\u w、箱号 对于rangeres_h中的 对于rangeres_w中的b: 结果[a,b]=func2a,b 返回结果 定义功能2a,b: 片段=渐变[a*窗口大小:a+1*窗口大小,b*窗口大小:b+1*窗口大小] hist=np.zerosbins\u编号 对于片段中的行: 对于行中的像素: nbin=intpixel[1]//bin\u宽度%9 历史[nbin]+=像素[1]-存储单元[nbin]/存储单元宽度*像素[0] 如果nbin!=垃圾箱编号-1: hist[nbin+1]+=bins[nbin+1]-像素[1]/bin_宽度*像素[0] 其他: 历史[0]+=180-像素[1]/bin_宽度*像素[0] 返回历史记录 但有许多变量必须用它来传递,这是保持简单的最有效的方法。把它放在某个类中,这给了你一个简单的方法来记住self中的变量。清楚地保存代码,哪些是必要的,哪些不是:

换行符也有助于提高可读性,请检查:

您还应该解释您试图使用该代码做什么:。我知道您不会喜欢这个答案,但老实说,我不知道。我只是有我需要使用的代码,我知道它会给出很好的结果,而且我知道它非常慢。这是我几乎可以肯定的瓶颈部分。所以我试图重构它而不深入细节,只是检查我的输出是否相同。并不是我不喜欢这个答案。你没有解释代码应该做什么。你知道它应该做什么吗?这个问题似乎不正确。也许更合适的提问地点是:。@CristiFati注意到CR需要OP来解释他们的代码的功能。确实是在性能和可读性增强方面寻求帮助的好地方,但是审阅者通常不喜欢首先猜测代码的用途。@MathieuGuindon:谢谢您的提示。就我个人而言,我没有访问过那个网站,但我认为它比这里好。@:同时:-1:。添加缺少的细节,我将收回它。