繁体   English   中英

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

[英]How can I find matching elements and indices from two arrays?

例如,

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)

Output:

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

那么,如何分别获得 arrays ab中匹配元素的索引?

IDL 中有一个 function 作为"match" - https://www.l3harrisgeospatial.com/docs/match.html

Python中是否有类似的function?

numpy.intersect1d return_indices

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

Output:

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

您可以使用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 function,这个 function 为迭代中的每个元素生成一个元组。 第一个元素是枚举(或本例中的索引),第二个元素是可迭代的。

这是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

从那里开始很简单,解压可迭代并检查两个元素是否相等,如果它们相等,则使用 append 枚举 # 到列表中!

像这样使用range

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

使用enumeratezip

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

output = [(i, x) for i, (x, y) in enumerate(zip(a, b)) if x == y]

print(output)

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

这导致元组列表为(index, value)

借助zip function 并行循环两个列表,这非常简单:

>>> count = 0
>>> indices = []
>>> for x, y in zip(a, b):
    if x == y:
        indices.append(count)
    count += 1

    
>>> indices
[0, 2, 5, 6, 9]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM