NumPy中多维数组的非元素比较

时间:2017-08-22 14:29:26

标签: python numpy multidimensional-array comparison

这可能是一个微不足道的问题,但我找不到一个不涉及大量 AND a.setid || ''= 'SHARE' AND b.setid || ''= 'SHARE' - 循环的解决方案。

我有一个多维数组(图像,所以for),我想找到具有一些rgb值的元素的索引。

使用(h,w,3)运算符或==函数执行逐元素运算,因此如果我的rgb元组为np.where并且我将其与{{1}进行比较它会产生(0,0,255),而整体颜色不一样,我想要的只是(0,0,0)。换句话说,我正在寻找一个比较元组而不是单个值的运算符。

显然,这可以通过双for循环和(True, True, False)运算符轻松完成,例如:

False

或循环中的这个:

.all()

但是我正在寻找一个单行,在for i in range(xx.shape[0]): for j in range(xx.shape[1]): (xx[i,j,:] == (5,5,5)).all() 的行中,但第三轴是全局匹配而不是元素。

1 个答案:

答案 0 :(得分:0)

您可以按元素进行比较,然后沿第三轴使用all

(xx == (5, 5, 5)).all(axis=2)

要获取索引,您可以使用np.where

np.where((xx == (5, 5, 5)).all(axis=2))

例如:

>>> xx = np.array([[[1, 2, 3], [5, 5, 5]],
...                [[1, 2, 3], [4, 5, 6]]])
>>> (xx == (5, 5, 5)).all(axis=2)
array([[False,  True],
       [False, False]], dtype=bool)

>>> np.where((xx == (5, 5, 5)).all(axis=2))
(array([0], dtype=int64), array([1], dtype=int64))

如果您不习惯使用all并以此方式广播,您还可以明确比较这些值:

>>> (xx[..., 0] == 5) & (xx[..., 1] == 5) & (xx[..., 2] == 5)
array([[False,  True],
       [False, False]], dtype=bool)