在比较多维数组时获取索引

时间:2014-08-03 17:16:28

标签: python arrays numpy multidimensional-array indexing

我有两个numpy数组,一个是RGB图像,一个是像素值的查找表,例如:

img = np.random.randint(0, 9 , (3, 3, 3))
lut = np.random.randint(0, 9, (1,3,3))

我想知道的是x,y像素中lut坐标的值imglut的共同点,所以我试过了:

for x in xrange(img.shape[0]):
    for y in xrange(img.shape[1]):
            print np.transpose(np.concatenate(np.where(lut == img[x,y])))

此时,问题是img[x,y][int_r, int_g, int_b]形式的img不会被评估为单个元素,因此在{{1}中单独寻找三个组件}} ...

我希望输出类似于:

(x_coord, y_coord)

但我只能以下列形式获得输出:

[0 0 0]
[0 2 1]
[0 0 2]
[0 0 0]
[0 0 0]
[0 0 2]
[0 0 1]
[0 2 2]
[0 1 2]

有人可以帮忙吗?谢谢!

2 个答案:

答案 0 :(得分:1)

img = np.random.randint(0, 9 , (3, 3, 3))
lut2 = img[1,2,:] # so that we know exactly the answer

# compare two matrices
img == lut2

array([[[False, False, False],
        [False, False, False],
        [False,  True, False]],

       [[False, False, False],
        [False, False, False],
        [ True,  True,  True]],

       [[ True, False, False],
        [ True, False, False],
        [False, False, False]]], dtype=bool)

# rows with all true are the matching ones
np.where( (img == lut2).sum(axis=2) == 3 )

(array([1]), array([2]))

我真的不知道为什么lut充满了随机数。但是,我认为你想要寻找具有完全相同颜色的像素。如果是这样,这似乎有效。这是你需要做的吗?

答案 1 :(得分:0)

如果将lut定义为单个[r,g,b]像素切片,则@otterb的答案有效,但如果要将此过程推广到a,则需要稍微调整一下多像素lut

img = np.random.randint(0, 9 , (3, 3, 3))
lut2 = img[0:1,0:2,:]

for x in xrange(lut2.shape[0]):
    for y in xrange(lut2.shape[1]):
        print lut2[x,y]
        print np.concatenate(np.where( (img == lut2[x,y]).sum(axis=2) == 3 ))

的产率:

[1 1 7]
[0 0]
[8 7 4]
[0 1]

其中三元组是像素值,双重是lut中的坐标。

干杯,感谢@otterb!

PS:对numpy数组的迭代很糟糕。以上不是生产代码。