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

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

我的问题是...
  • np.isin没有axis属性,因此我可以使用axis=1
  • 甚至将逻辑和应用到输出的每一行都将为最后一个元素返回True,这是错误的。

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

    最佳答案

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

    这是利用 broadcasting 的一种方法:

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

    细节
    通过直接比较在coo中添加了第一个轴,以便针对target进行广播,从而检查coo中的每一行是否与targets中的另一行相匹配:
    (coo[:,None] == targets)
    
    array([[[False, False],
            [ True, False]],
    
           [[False, False],
            [ True,  True]],
    
           [[ True,  True],
            [False, False]],
    
           [[False, False],
            [False,  True]]])
    
    然后检查第二个轴上哪个ndarrays具有all True 值:
    (coo[:,None] == targets).all(2)
    
    array([[False, False],
           [False,  True],
           [ True, False],
           [False, False]])
    
    最后使用 any 来检查哪些行至少具有一个True

    10-08 08:41