最近、これについて質問を投稿しましたが、最終的にエレガントではない方法で解決しました。
numpy 配列である 2 つの画像があり、2 つの画像を反復する新しい配列を作成したいと考えています。3つのケースがあり、次のことを行いました。
delta= np.empty((h, w, 3),int)
for z in range (0,3):
for i in range(0, (h-1)):
for j in range(0, (w-1)):
delta[i][j][z]=np.sqrt(((imgLlab[i][j][0]-imgRlab[i][j-disp[i][j]][0])**2) + ((imgLlab[i][j][1]-imgRlab[i][j-disp[i][j]][1])**2) + ((imgLlab[i][j][2]-imgRlab[i][j-disp[i][j]][2])**2) )
delta= np.empty((h, w, 3),int)
for z in range (0,3):
for i in range(0, (h-1)):
for j in range(0, (w-1)):
delta[i][j][z]=np.sqrt(((imgLlab[i][j][0]-imgRlab[i][j-disp[i][j]][0])**2) )
for z in range (0,3):
for i in range(0, (h-1)):
for j in range(0, (w-1)):
delta[i][j][z]=np.sqrt(((imgLlab[i][j][1]-imgRlab[i][j-disp[i][j]][1])**2) + ((imgLlab[i][j][2]-imgRlab[i][j-disp[i][j]][2])**2) )
毎回反復を繰り返さず、できるだけ迅速に実行したいと思います。
numpyでこれを行う別の方法はありますか?
ハイメの助けの後に編集して、コードを次のように変更しました。
disp= np.hstack([disp, disp, disp]).reshape(h,w,3).astype(np.int)
rows = np.arange(h).reshape(h, 1, 1)
cols = np.arange(w).reshape(1, w, 1)
planes = np.arange(3).reshape(1, 1, 3)
print rows.shape, cols.shape, planes.shape, disp.shape, h
data = imgLlab[rows, cols, planes] - imgRlab[rows ,cols - disp[rows, cols, planes], planes]
data = data**2
data = np.sum(data, axis=-1)
data = np.sqrt(data)
imglLab と imgRLab の形状が同じではなかったため、dist の形状を変更する必要がありました。つまり、imglLab は (288, 384,3) であり、disp は (288,384) でした。また、disp(288,384,1) を出力すると、同じエラーが発生します。そこには値がないようですが、寸法は他のものと同じです。しかし、3 つの配列が同じ次元になったので、indexError: index (384) out of range (0<=index(383) in dimension 1.