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