向量化嵌套循环

时间:2019-01-09 17:23:58

标签: python for-loop vectorization

我需要向量化两个嵌套的for循环,并且不知道该怎么做。一种是用于灰度图像,另一种是用于彩色图像。我想用kuwahara过滤器过滤图像。您在下面看到的代码是我必须向量化才能获得快速功能的最后一步。

  • 数组img_kuwahara的形状为mxn或mxnx3(彩色图像)
  • 数组index_min的形状为mxn
  • 数组均值的形状为4xmxn(灰度)或3x4xmxn(彩色)

我需要从均值数组中获取正确的值到img_kuwahara数组中。

作为示例数据,您可以使用以下数组:

index_min = np.array([[0,1,1,2,3],[3,3,2,2,2,2],[2,3,3,0, 2],[0,1,1,0,3],[2,1,3,0,0]])

平均值 = np.random.randint(0,256,size =(4,5,5))(灰度图像)

平均值 = np.random.randint(0,256,size =(3,4,5,5))(彩色图像)

行= 5,列= 5

谢谢您的帮助

# Edit gray scale image
if len(image.shape) == 2:

    # Set result image
    img_kuwahara = np.zeros((row, columns), dtype=imgtyp)

    for k in range(0, row):
        for i in range(0, columns):
            img_kuwahara[k, i] = mean[index_min[k, i], k, i]



# Edit color image
if len(image.shape) == 3:

    # Set result image
    img_kuwahara = np.zeros((row, columns, 3), dtype=imgtyp)

    for k in range(0, row):
        for i in range(0, columns):
            img_kuwahara[k, i, 0] = mean[0][index_min[k, i], k, i]
            img_kuwahara[k, i, 1] = mean[1][index_min[k, i], k, i]
            img_kuwahara[k, i, 2] = mean[2][index_min[k, i], k, i]

1 个答案:

答案 0 :(得分:2)

可以使用np.meshgrid对第一个循环进行矢量化:

j, i = np.meshgrid(range(columns), range(rows))
img_kuwahara = mean[index_min[i, j], i, j]

第二个循环可以通过使用附加的np.moveaxis进行矢量化处理(假设mean实际上是4D数组,而不是3D数组的列表;否则只需对其进行转换):

j, i = np.meshgrid(range(columns), range(rows))
img_kuwahara = np.moveaxis(mean, 0, -1)[index_min[i, j], i, j]

除了np.meshgrid以外,您还可以使用np.mgrid(它支持更自然的语法):

i, j = np.mgrid[:rows, :columns]