我正在尝试对以下代码进行矢量化 -
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。
答案 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矢量化代码中它不是。