[英]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
a
和b
中匹配元素的索引?
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
:使用
enumerate
和zip
:
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.