循环变量感知numpy的切片和矢量化计算

时间:2014-12-17 05:47:49

标签: python numpy scipy

如何使用numpy的切片和矢量化(自动循环)计算来加速跟随纯Python代码

def foo(x, i, j):
  return x + i + j % 255

h, w = img.shape[:2]   # img is a numpy array of shape (100,100,1)
out_img = img.copy()
for i in xrange(h):
  for j in xrange(w):
    out_img[i][j] = foo(img[i][j], i, j)

如果foo的形式是' foo(img [i] [j])' (没有循环变量作为参数),以下为我工作

out_img[0:,0:] = foo(img[0:,0:])

注意:与纯python相比,Numpy为上述情况提供了~70倍的加速。

我无法想象如何使用循环变量作为参数使其适用于函数foo 有人可以帮忙吗?

1 个答案:

答案 0 :(得分:4)

您可以使用numpy.indices,例如:

out_img = foo(img, *np.indices(shape=(h,w)))

或稍微更明确:

h_indices, w_indices = np.indices(shape=(h,w))
out_img = foo(img, h_indices, w_indices)

说明np.indices的作用:

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

       [[0, 1],
        [0, 1],
        [0, 1]]])