【问题标题】:Python - Obtain indices of intersecting values in two arrays [duplicate]Python - 获取两个数组中相交值的索引[重复]
【发布时间】:2020-06-21 07:34:01
【问题描述】:

如果我有两个数组:

A=[1,2,3,4,5,6,7]  
B=[2,4,7]  

我想获得一个数组C,其中包含B 的值的索引,也可以在A 中找到

C=[1,3,6]   

我对 Python 还是很陌生,我很沮丧,因为我无法找到一个优雅的解决方案来解决如此简单的任务,而无需使用与 numpy.where() 结合的循环。

提前致谢!!

【问题讨论】:

  • 在您的示例中,B 中的每个值也存在于 A 中。会一直如此吗?
  • 如果B 元素不在A 中,输出应该是什么?例如B = [2,44,7]?另外,如果它出现在A 的多个位置怎么办?还是 A 条目是唯一的?

标签: python python-3.x list numpy


【解决方案1】:

numpy 模块中有一个特殊的函数,intersect1d 通过在其return_indices 参数中传递True,您可以获得交集的索引。

import numpy as np
a = np.array([1,2,3,4,5,6,7])
b = np.array([2,4,7])
c = np.intersect1d(a, b, return_indices=True)[1]
# array([1, 3, 6], dtype=int64)

【讨论】:

  • 我认为你的回答比我的要快。你认为原因是什么?
【解决方案2】:

您可以使用np.isinnp.nonzero

a=np.array([1,2,3,4,5,6,7])
b=np.array([2,4,7])
c=np.nonzero(np.isin(a,b))[0]
# array([1, 3, 6], dtype=int64)

【讨论】:

  • 你知道np.isin的时间复杂度吗?我在文档中没有看到它。
  • @HeapOverflow 我在 Numpy 文档中找到了这个。 isin(a, b) 大致相当于 np.array([item in b for item in a]) 相当于O(m*n)
  • 我不会从文档的那部分假设它是 O(mn) - 通常文档会给出一个“等效”表达式来解释行为/输出是什么,但这并不意味着在实现上是等价的。
  • 嗯,它说的是“大致”,而“等价”可能只是指结果,而不是效率。
  • @kaya3 令人沮丧地看到他们进行了如此长时间的讨论,但从不谈论复杂性(据我所知)。不管怎样,a test 说每秒会进行 1600 亿次比较,这不是真的。
【解决方案3】:

这是一个线性时间解决方案:为了有效地测试一个元素是否在 B 中,首先将其转换为一个集合。

B_set = set(B)
C = [i for i, x in enumerate(A) if x in B_set]

对于大型输入,这比在循环中使用.index 更好,因为这需要在 O(mn) 时间内重复搜索列表,其中 m 和 n 是 A 和 B 的大小。相比之下,解决方案上面需要 O(m + n) 时间来转换为一个集合,然后构建结果列表。

【讨论】:

  • 这比 Guy 的方法要好,因为 .index 只返回数字第一次出现的索引。如果您有重复项并希望获得线性时间,则此解决方案会更好。+1
【解决方案4】:

您可以遍历 B 并在 A 上使用 index() 和值

c = [A.index(i) for i in B]

根据@kaya3 的评论,您可以添加检查B 的值是否存在于A 中,以防它可能包含不存在的值

c = [A.index(i) for i in B if i in A]

【讨论】:

    【解决方案5】:

    您可以使用索引功能。

    A = [1,2,3,4,5,6,7]
    B = [2,4,7]
    C = [a.index(b) for b in B]
    C = list(map(lambda b: a.index(b),B)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-24
      • 1970-01-01
      • 2017-05-04
      • 2017-12-29
      • 1970-01-01
      • 2013-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多