私は次のコードをベクトル化しようとしています-
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 3ndarrayです。dispはNx Mndarrayです。
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のベクトル化コードではそうではありません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加