使用 np.where 在二维数组中查找匹配行

Posted

技术标签:

【中文标题】使用 np.where 在二维数组中查找匹配行【英文标题】:Using np.where to find matching row in 2D array 【发布时间】:2017-06-18 23:10:07 【问题描述】:

我想知道如何将np.where 与二维数组一起使用

我有以下数组:

arr1 = np.array([[ 3.,  0.],
                 [ 3.,  1.],
                 [ 3.,  2.],
                 [ 3.,  3.],
                 [ 3.,  6.],
                 [ 3.,  5.]])

我想找到这个数组:

arr2 = np.array([3.,0.])

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

np.where(arr1 == arr2)

返回:

(array([0, 0, 1, 2, 3, 4, 5]), array([0, 1, 0, 0, 0, 0, 0]))

我不明白这是什么意思。谁能帮我解释一下?

【问题讨论】:

你看过arr1 == arr2吗? 【参考方案1】:

您可能想要所有与您的arr2 相同的行:

>>> np.where(np.all(arr1 == arr2, axis=1))
(array([0], dtype=int64),)

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


您的方法的问题是 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.]]) 

然后进行元素比较:

>>> arr1 == arr2
array([[ True,  True],
       [ True, False],
       [ True, False],
       [ True, False],
       [ True, False],
       [ True, False]], dtype=bool)

然后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)
#  ...

这意味着(0, 0)(第一行左侧项目)是第一个True,然后是0, 1(第一行右侧项目),然后是1, 0(第二行左侧项目),......


如果您在第一个轴上使用np.all,您将获得所有完全相等的行:

>>> np.all(arr1 == arr2, axis=1)
array([ True, False, False, False, False, False], dtype=bool)

如果保持尺寸可以更好地可视化:

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

【讨论】:

以上是关于使用 np.where 在二维数组中查找匹配行的主要内容,如果未能解决你的问题,请参考以下文章

二维矩阵上的 Numpy where()

PHP在二维数组查找匹配字符串元素是怎样使得它的效率变得比较高的?

numpy.where

C++中如何在一个二维数组中查找某个值

剑指offer:二维数组中的查找

c语言查找二维数组的鞍点 新生求助大佬