1

最近、これについて質問を投稿しましたが、最終的にエレガントではない方法で解決しました。

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.

4

1 に答える 1

1

コードで改善できる点がいくつかあります。

  1. 配列を としてインデックス付けしないでくださいarr[a][b][c]。それを行うと、効果的に python objectarr[a]を作成し、それを使用して、目的のオブジェクトを構築する新しい python オブジェクトを作成しarr[a][b]ますarr[a][b][c]。numpy のタプル インデックス as を使用すると、中間の構築と破棄がすべて排除されarr[a, b, c]ます。

  2. ループが不要な場合は使用しないでください。それ以外の

    for j in xrange(len(a)) :
        a[j] = b[j]
    

    できるよ

    a[:] = b[:]
    

    これは実際に numpy を優れたものにする種類のものなので、使用してください!

imgLlab.shapeコードの高速化については... 、imgRlab.shapeおよびdisp.shapeすべて同じであることを確認する必要があり(h, w, 3)ます。インデックス エラーは、そのうちの 1 つが小さいことを示しています。とにかく、ブロードキャスト派手なインデックス作成を利用する必要がある後で、あなたが何であるかを取得します。これらのリンクを読んで消化しないと、次のことはほとんど意味がありません。

rows = np.arange(h).reshape(h, 1, 1)
cols = np.arange(w).reshape(1, w, 1)
planes = np.arange(3).reshape(1, 1, 3)
data = imgLlab[rows, cols, planes] - \ 
       imgRlab[planes, rows - disp[rows, cols, planes], planes]
# data is of shape (h, w, 3)
data = data**2
# data is of shape (h, w, 3)
data = np.sum(data, axis=-1)
# data is of shape (h, w)
data = np.sqrt(data)
# data is of shape (h, w)

まったく同じ配列を配列の 3 つのプレーンにコピーしたい場合は、次のdeltaように実行できます。

delta[...] = data.reshape(h, w, 1) # equivalent to data.reshape(-1, 1)

これは最初のケースにすぎませんが、何が起こっているのかを理解すれば、この最初の例から他のものを簡単に構築できるはずです。困ったらまた聞きに来てね!

于 2013-01-18T18:24:40.410 に答える