矢量化numpy代码

时间:2018-06-14 15:07:20

标签: numpy vectorization numpy-ndarray

我正在尝试对以下代码进行矢量化 -

for i in range(imL.shape[0]):
    for j in range(imL.shape[1]):
        if j - disp[i][j] >= 0:
            imR[i, j - disp[i][j], :] = imL[i, j, :]

基本上,我想这样做 -

A[i, j - B[i, j], k] = C[i, j, k] for all (i, j, k)

我查看了布尔索引并提出了这个 -

tmp = np.arange(imR.shape[1])
tmp = np.repeat(tmp[np.newaxis, :], imR.shape[0], axis=0)
tmp = np.repeat(tmp[:, :, np.newaxis], imR.shape[2], axis=2)

imR[(tmp - disp) >= 0] = imL

但是,这会引发错误 -

TypeError: NumPy boolean array indexing assignment requires a 0 or 1-dimensional input, input has 3 dimensions

我相信整数索引是解决方案,但是,我无法想出任何东西。有没有办法有效地对此进行矢量化?

注意:imL和imR是N x M x 3个ndarray。 disp是N x M ndarray。

1 个答案:

答案 0 :(得分:1)

您可以使用np.indices

简化临时索引数组的创建
i_indices, j_indices = np.indices(disp.shape)

然后,您可以使用自定义公式创建更新的索引数组:

# j - B[i, k]
new_j_ind = j_indices - disp

在条件

上将原始j替换为已更新的j
# if j - disp[i][j] < 0, keep original j index
new_j_ind[new_j_ind < 0] = j_indices[new_j_ind < 0]

编写数组。

# A[i, j - B[i, j] if j - B[i, j] > 0 else j, k] = C[i, j, k] for all (i, j, k)
imR[i_indices, new_j_ind] = imL

小心:如果[i, j - B[i, j]]映射到任何(i,k)的相同坐标,则定义不明确。在for循环中它被很好地定义(最后写入的值获胜),在numpy矢量化代码中它不是。