如何解决如何从两个数组中找到匹配的元素和索引?
例如
a = [1,1,2,4,5,6,7,100]
b = [1,8,100]
我可以使用以下方法找到匹配的元素:
np.intersect1d(a,b)
输出:
array([ 1,100])
那么,如何分别获取数组 a
和 b
中匹配元素的索引?
IDL 中有一个函数为 "match"
- https://www.l3harrisgeospatial.com/docs/match.html
Python 中是否有类似的函数?
解决方法
在 return_indices
中使用 numpy.intersect1d
:
intersect,ind_a,ind_b = np.intersect1d(a,b,return_indices=True)
输出:
intersect
# array([ 1,2,4,5,7,100])
ind_a
# array([0,3,6,8,9],dtype=int64)
ind_b
# array([0,1,dtype=int64)
然后可以重复使用:
np.array(a)[ind_a]
np.array(b)[ind_b]
array([ 1,100])
,
您可以使用 enumerate
跟踪索引,如下所示:
a = [1,100]
b = [1,100]
# 0 1 2 3 4 5 6 7 8 9
print([i for i,x in enumerate(zip(a,b)) if x[0] == x[1]])
[0,9]
这里发生了什么?!
我们正在利用惊人的 enumerate
函数!此函数为可迭代对象中的每个元素生成一个元组,第一个元素是枚举(或本例中的索引),第二个元素是可迭代对象。
zip(a,b)
的枚举如下所示
[(0,(1,1)),2)),(2,(3,(4,(5,4)),(6,5)),(7,7)),(8,8)),(9,(100,100))]
# lets look a little closer at one element
(0,1))
# ^ ^
# index iterable
从这里开始就很简单了!解压可迭代对象并检查两个元素是否相等,如果相等,则将枚举 # 附加到列表中!
,像这样使用 range
:
matching_idxs = [idx for idx in range(len(a)) if a[idx] == b[idx]]
print(matching_idxs)
# [0,9]
,
使用 enumerate
和 zip
:
a = [1,100]
output = [(i,x) for i,(x,y) in enumerate(zip(a,b)) if x == y]
print(output)
[(0,1),2),4),5),100)]
这导致元组列表为 (index,value)
借助 scanf()
函数并行循环两个列表,这非常简单:
zip
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。