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

2024-05-19 14:14:30 发布

您现在位置:Python中文网/ 问答频道 /正文

比如说,

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

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

np.intersect1d(a,b)

输出:

array([  1,   2,   4,   5,   7, 100])

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

IDL中有一个函数"match"-https://www.l3harrisgeospatial.com/docs/match.html

Python中有类似的函数吗


Tags: 方法函数httpscom元素docshtmlwww
3条回答

您可以使用enumerate跟踪索引,如下所示:

a = [1, 1, 2, 4, 4, 4, 5, 6, 7, 100]
b = [1, 2, 2, 2, 2, 4, 5, 7, 8, 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, 2, 5, 6, 9]

这是怎么回事

我们正在利用惊人的enumerate函数!此函数为iterable中的每个元素生成一个元组,第一个元素是枚举(或本例中的索引),第二个元素是iterable

下面是zip(a,b)的枚举形式

[(0, (1, 1)), (1, (1, 2)), (2, (2, 2)), (3, (4, 2)), (4, (4, 2)), (5, (4, 4)), (6, (5, 5)), (7, (6, 7)), (8, (7, 8)), (9, (100, 100))]

# lets look a little closer at one element
(0, (1, 1))
# ^     ^
# index iterable

从那以后就很简单了!解包iterable并检查两个元素是否相等,如果相等,则使用将枚举添加到列表中

numpy.intersect1d中使用return_indices

intersect, ind_a, ind_b = np.intersect1d(a,b, return_indices=True)

输出:

intersect
# array([  1,   2,   4,   5,   7, 100])
ind_a
# array([0, 2, 3, 6, 8, 9], dtype=int64)
ind_b
# array([0, 1, 5, 6, 7, 9], dtype=int64)

然后可以重复使用,如:

np.array(a)[ind_a]
np.array(b)[ind_b]

array([  1,   2,   4,   5,   7, 100])

像这样使用range

matching_idxs = [idx for idx in range(len(a)) if a[idx] == b[idx]] 
print(matching_idxs)
# [0, 2, 5, 6, 9]

相关问题 更多 >