Numpy加速嵌套循环与花式索引

时间:2016-10-30 11:19:06

标签: python arrays algorithm numpy

我目前实施了一种算法,该算法根据总变差计算视差图的质量评估。

我对python相对较新,但已经在加速numpy代码上读了很多线程。视图与花式索引,尝试使用Cython,嵌套循环的矢量化等。我实现了一些加速但完全,我在杂乱的代码中越来越多地结束而没有达到适当的加速。

我想知道是否有人可以给我一个提示,如果有一个干净简单的方法来加速这个2d循环。

TV是一个2D阵列,具有~15k x 15k元素 footprint_ix和_iy是2个数组列表,如果像素x,y以环形方式包含相邻像素的索引偏移量。当m = 1时,选择8个neighborpixel,m = 2,接下来的16个,依此类推

该算法对x,y的相邻像素求和,并在未超过阈值TAU时增加m。

我提出的最佳解决方案,到目前为止使用逐行多处理。

# create footprints
footprint_ix = []
footprint_iy = []
for m in range(1, m_classes):    
    fp = np.ones((2 * m + 1, 2 * m + 1), dtype = int)
    fp [ 1 : -1, 1 : -1] = 0
    i, j = np.nonzero(fp)
    i = i - m
    j = j - m

    footprint_ix.append(i)
    footprint_iy.append(j)


m_classes = 21
for x in xrange( 0, rows):
    for y in xrange ( 0, cols):   
        if disp[x,y] == np.inf: 
            continue
        else:
            tv_m = 0

            for m_i in range (0, m_classes-1):
                m = m_i + 1
                try:
                    tv_m += np.sum( tv[footprint_ix[m_i] + x, footprint_iy[m_i] + y] )  / (8 * m)                   
                except IndexError:
                    tv_m = np.inf

                if tv_m >= TAU:
                    tv_classes[x,y] = m
                    break

                if m == m_classes - 1:
                    tv_classes[x,y] = m

0 个答案:

没有答案