1

最近我发布了一个关于这个的问题,但最后我以一种不优雅的方式解决了它。

我有 2 个图像是 numpy 数组,我想创建一个新数组迭代 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 做到这一点?

在 Jaime 帮助之后进行编辑,我已经像这样更改了我的代码:

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)

我不得不重塑 dist 因为它没有 imglLab 和 imgRLab 的相同形状,我的意思是 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 对象arr[a],然后使用它来创建一个新的 python 对象arr[a][b],从中arr[a][b][c]构造您想要的对象。如果您使用 numpy 的元组索引作为arr[a, b, c].

  2. 不要在不需要时使用循环!代替

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

    你可以做

    a[:] = b[:]
    

    这实际上是让 numpy 变得很棒的东西,所以使用它!

至于加快你的代码......你应该检查一下imgLlab.shapeimgRlab.shape并且disp.shape都是一样的,(h, w, 3)。您的索引错误表明其中一个较小。无论如何,要在我们需要利用广播精美的索引之后获得您的身份。阅读并消化这些链接,否则以下内容将毫无意义:

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)

如果您真的想将完全相同的数组复制到数组的三个平面delta,您可以这样做:

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

这只是您的第一个案例,但是一旦您了解发生了什么,其他案例应该很容易从第一个示例构建。有问题就回来问吧!

于 2013-01-18T18:24:40.410 回答