使用np.where在2D数组中查找匹配的行

dca*_*ida 4 python arrays numpy python-2.7

我想知道如何np.where与2D阵列一起使用

我有以下数组:

arr1 = np.array([[ 3.,  0.],
                 [ 3.,  1.],
                 [ 3.,  2.],
                 [ 3.,  3.],
                 [ 3.,  6.],
                 [ 3.,  5.]])
Run Code Online (Sandbox Code Playgroud)

我想找到这个数组:

arr2 = np.array([3.,0.])
Run Code Online (Sandbox Code Playgroud)

但是当我使用时np.where()

np.where(arr1 == arr2)
Run Code Online (Sandbox Code Playgroud)

它返回:

(array([0, 0, 1, 2, 3, 4, 5]), array([0, 1, 0, 0, 0, 0, 0]))
Run Code Online (Sandbox Code Playgroud)

我不明白这是什么意思。有人可以帮我解释一下吗?

MSe*_*ert 7

您可能希望所有等于您的行arr2

>>> np.where(np.all(arr1 == arr2, axis=1))
(array([0], dtype=int64),)
Run Code Online (Sandbox Code Playgroud)

这意味着第一行(零索引)匹配。


您的方法存在的问题是numpy广播了数组(用可视化np.broadcast_arrays):

>>> arr1_tmp, arr2_tmp = np.broadcast_arrays(arr1, arr2)
>>> arr2_tmp
array([[ 3.,  0.],
       [ 3.,  0.],
       [ 3.,  0.],
       [ 3.,  0.],
       [ 3.,  0.],
       [ 3.,  0.]]) 
Run Code Online (Sandbox Code Playgroud)

然后进行逐元素比较:

>>> arr1 == arr2
array([[ True,  True],
       [ True, False],
       [ True, False],
       [ True, False],
       [ True, False],
       [ True, False]], dtype=bool)
Run Code Online (Sandbox Code Playgroud)

np.where然后给你的每一个坐标True

>>> np.where(arr1 == arr2)
(array([0, 0, 1, 2, 3, 4, 5], dtype=int64),
 array([0, 1, 0, 0, 0, 0, 0], dtype=int64))
#       ^---- first match (0, 0)
#          ^--- second match (0, 1)
#             ^--- third match (1, 0)
#  ...
Run Code Online (Sandbox Code Playgroud)

这意味着(0, 0)(第一行左边的项目)是first True,然后是0, 1(第一行右边的项目),然后是1, 0(第二行,左边的项目)...。


如果np.all沿第一个轴使用,则会得到完全相等的所有行:

>>> np.all(arr1 == arr2, axis=1)
array([ True, False, False, False, False, False], dtype=bool)
Run Code Online (Sandbox Code Playgroud)

如果保持尺寸不变,则可以更好地可视化:

>>> np.all(arr1 == arr2, axis=1, keepdims=True)
array([[ True],
       [False],
       [False],
       [False],
       [False],
       [False]], dtype=bool)
Run Code Online (Sandbox Code Playgroud)