首页 > 解决方案 > 如何匹配两个numpy数组中包含的值对

问题描述

我有两组坐标,想找出该组的哪些坐标与该coo组中的任何坐标相同targets。我想知道coo集合中的索引,这意味着我想获取索引或布尔列表。

import numpy as np

coo = np.array([[1,2],[1,6],[5,3],[3,6]]) # coordinates
targets = np.array([[5,3],[1,6]]) # coordinates of targets

print(np.isin(coo,targets))

[[ True False]
 [ True  True]
 [ True  True]
 [ True  True]]

期望的结果将是以下两种之一:

[False True True False] # bool list
[1,2] # list of concerning indices

我的问题是,那...

我知道循环和条件,但我确信 Python 配备了更优雅的解决方案。

标签: pythonnumpycoordinatesnumpy-ndarray

解决方案


对于大型阵列,此解决方案的扩展性会更差,在这种情况下,其他建议的答案会表现得更好。


这是利用的一种方法broadcasting

(coo[:,None] == targets).all(2).any(1)
# array([False,  True,  True, False])

细节

通过添加第一个轴的直接比较来检查每一行coo是否与另一行匹配,以便它可以广播:targetcootargets

(coo[:,None] == targets)

array([[[False, False],
        [ True, False]],

       [[False, False],
        [ True,  True]],

       [[ True,  True],
        [False, False]],

       [[False, False],
        [False,  True]]])

然后检查ndarrays沿第二个轴的allTrue

(coo[:,None] == targets).all(2)

array([[False, False],
       [False,  True],
       [ True, False],
       [False, False]])

最后用于any检查哪些行至少有一个True.


推荐阅读