简体   繁体   English

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

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

For example,例如,

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

I can find the matching elements using:我可以使用以下方法找到匹配的元素:

np.intersect1d(a,b)

Output: Output:

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

Then, how can I get the indices of matched elements in arrays a and b , respectively?那么,如何分别获得 arrays ab中匹配元素的索引?

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

Is there a similar function in Python? Python中是否有类似的function?

Use return_indices in numpy.intersect1d :numpy.intersect1d return_indices

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

Output: 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)

Which can then be reused like:然后可以像这样重复使用:

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

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

you can track indexes using enumerate as follows:您可以使用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]

so what's going on here?!那么这里发生了什么?!

We're taking advantage of the amazing enumerate function, This function generates a tuple for each element in an iterable.我们正在利用惊人的enumerate function,这个 function 为迭代中的每个元素生成一个元组。 with the first element being the enumeration (or the index in this case) and the second being the iterable.第一个元素是枚举(或本例中的索引),第二个元素是可迭代的。

Heres what the enumeration of zip(a,b) looks like这是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

From there on it's simple, Unpack the iterable and check if both elements are equal, and if they are then use append the enumeration # to a list!从那里开始很简单,解压可迭代并检查两个元素是否相等,如果它们相等,则使用 append 枚举 # 到列表中!

Use range like so:像这样使用range

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

Using enumerate and zip :使用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)]

This results in a list of tuples being (index, value)这导致元组列表为(index, value)

this is very straightforward with the help of zip function to loop two lists in parallel:借助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