矢量化numpy码

矢量化numpy码,numpy,vectorization,numpy-ndarray,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) 我研究了布尔索引并得出了这个结论- t

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

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 nArray。disp是一个N x M数据数组。

您可以通过以下方法简化临时索引数组的创建:

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

# j - B[i, k]
new_j_ind = j_indices - disp
在以下条件下,用原始的
j
s替换更新的
j
值:

# if j - disp[i][j] < 0, keep original j index
new_j_ind[new_j_ind < 0] = j_indices[new_j_ind < 0]

但是要小心:如果
[i,j-B[i,j]]
曾经映射到任何(i,k)的相同坐标,那么这并不是很好的定义。在for循环中,它是定义良好的(最后写入的值获胜),而在numpy矢量化代码中,它不是

感谢您提供有关将
np.index
用于临时索引数组的提示。但是,步骤
imR[select]=imL[select]
在语义上不是我想要实现的。我相信它可以翻译成A[I,j-B[I,j],k]=C[I,j-B[I,j],k]表示所有(I,j,k)。与for-loop相比,它肯定不会给我相同的结果。事实上,我误解了这个问题。最初提出的解决方案是:对于所有(i,j,k),其中j-B[i,j]>0,A[i,j,k]=C[i,j,k]。我更新了答案。谢谢你,这非常有效。我不明白在
imR[I_index,new_j_ind]=imL
中索引是如何工作的。你能给我指一些我可能进一步理解它的资源吗?文档中有几个很好的例子,你可以从那里开始:。我经常发现,举一个简单的例子(比如文档中的例子)并在iPython会话中使用它会很有帮助。
# 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