微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从两个数组中找到匹配的元素和索引?

如何解决如何从两个数组中找到匹配的元素和索引?

例如

a = [1,1,2,4,5,6,7,100]
b = [1,8,100]

我可以使用以下方法找到匹配的元素:

np.intersect1d(a,b)

输出

array([  1,100])

那么,如何分别获取数组 ab 中匹配元素的索引?

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]
,

使用 enumeratezip

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 举报,一经查实,本站将立刻删除。