python - 使用 np.where 查找二维数组中的匹配行

标签 python arrays python-2.7 numpy

我想知道如何将 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]))

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

最佳答案

您可能希望所有行都等于您的 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(第一行右item), 然后是 1, 0 (第二行, left item), ....


如果您沿第一个轴使用 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)

关于python - 使用 np.where 查找二维数组中的匹配行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41992745/

相关文章:

python - 在 Python 3 中安装和运行模块(初学者)

python - 使用python2.7进行数据提取和求和

python - 选项解析器与参数不匹配

arrays - C 指向数组的指针未赋值

java - 字符串数组到对象数组

javascript - 输入数组将它们分开

python - 如何使用 Nose 忽略特定文件夹中的所有测试?

python - 如果我可以直接使用cursor.execute,为什么我要引用cursor.fetchall()?

python - 使用 Numpy 的多项式的系数误差

python - Tensorflow 体育预测