[英]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 a
和b
中匹配元素的索引?
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]
使用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)]
这导致元组列表为(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.