我有两组坐标,想找出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
。