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

Python NumPy中多维数组的非元素比较,python,numpy,multidimensional-array,comparison,Python,Numpy,Multidimensional Array,Comparison,这可能是一个很小的问题,但我找不到一个不涉及大量for-循环的解决方案 我有一个多维数组(一个图像,所以(h,w,3)),我想找到具有一些rgb值的元素的索引 使用=操作符或np。其中函数执行元素操作,因此如果我的rgb元组是(0,0255),我将其与(0,0,0)进行比较,它将导致(真、真、假),而整体颜色不一样,我想要的只是假。换句话说,我正在寻找一个比较元组而不是单个值的操作符 显然,使用double for循环和.all()运算符可以轻松实现这一点,例如: for i in range(

这可能是一个很小的问题,但我找不到一个不涉及大量
for
-循环的解决方案

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

使用
=
操作符或
np。其中
函数执行元素操作,因此如果我的rgb元组是
(0,0255)
,我将其与
(0,0,0)
进行比较,它将导致
(真、真、假)
,而整体颜色不一样,我想要的只是
。换句话说,我正在寻找一个比较元组而不是单个值的操作符

显然,使用double for循环和
.all()
运算符可以轻松实现这一点,例如:

for i in range(xx.shape[0]):
    for j in range(xx.shape[1]):
        (xx[i,j,:] == (5,5,5)).all()
或者在循环内部:

np.array_equals(xx[i,j], (5,5,5))

但是我在寻找一个单行,在
xx==(5,5,5)
的行中,但是第三个轴是全局匹配的,而不是元素匹配的。

您可以按元素比较它们,然后沿第三个轴使用:

(xx == (5, 5, 5)).all(axis=2)
要获取可用于此目的的索引,请执行以下操作:

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)

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

(xx == (5, 5, 5)).all(axis=2)
要获取可用于此目的的索引,请执行以下操作:

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)
那么
(xx==(5,5,5))。所有使用
广播的(-1)
?如何使用
(xx==(5,5,5))。所有使用
广播的(-1)