【问题标题】:Find arrays of ndarray that are in another ndarray - Python查找另一个ndarray中的ndarray数组 - Python
【发布时间】:2018-03-25 01:05:07
【问题描述】:

我想知道是否有任何内置方法可以查找包含在另一个 ndarray 中的 ndarray 的数组。 即

arr1 = [[1,2], [2,9], [3,7], [5,11], [32,5], [11,4], [89,3], [37,5]]

arr2 = [[12,44], [2,9], [125,3], [37,5]]

我想知道是否有任何内置方法可以识别[2,9][37,5]arr2 包含在arr1 中的唯一数组。或者识别它们的索引。

【问题讨论】:

  • 你为什么不试试[x for x in arr1 if x in arr2] 这不会给出索引,而是元素本身。
  • 只使用列表理解

标签: python python-3.x multidimensional-array


【解决方案1】:

您可以使用集合和元组来做到这一点,使用:

arr1 = [[1,2], [2,9], [3,7], [5,11], [32,5], [11,4], [89,3], [37,5]]
arr2 = [[12,44], [2,9], [125,3], [37,5]]

set1 = {tuple(i) for i in arr1}
set2 = {tuple(i) for i in arr2}

arr3 = [list(i) for i in set1 & set2]

但是使用列表推导会简单得多

arr3 = [i for i in arr1 if i in arr2]

【讨论】:

    【解决方案2】:

    如果你使用集合:

    a = [1,2,3,4,"B"]
    b = [2, "B", 5]
    sa = set(a)
    sb = set(b)
    c = list(sa.intersection(sb))
    

    c 将是:

    [2, "B"]
    

    【讨论】:

    • 无论原始数组中的类型如何,它都可以工作
    【解决方案3】:

    一种方法是在将每一行映射到tuple 之后,使用两个列表的行的交集。

    之所以需要转换为tuple,是因为元组是不可变且可散列的。因此,它们可以包含在set 中,而列表则不能。

    arr1 = [[1,2], [2,9], [3,7], [5,11], [32,5], [11,4], [89,3], [37,5]]
    arr2 = [[12,44], [2,9], [125,3], [37,5]]
    
    res = set(map(tuple, arr1)) & set(map(tuple, arr2))
    
    # {(2, 9), (37, 5)}
    

    如果需要,将结果转换回列表:

    res2 = list(map(list, res))
    
    # [[37, 5], [2, 9]]
    

    如果numpy 数组可行,则可能是更有效的替代解决方案:

    1. Get intersecting rows across two 2D numpy arrays
    2. Find arrays of ndarray that are in another ndarray - Python

    【讨论】:

      猜你喜欢
      • 2021-03-14
      • 2018-04-12
      • 2021-10-15
      • 2018-06-05
      • 2016-05-16
      • 2013-09-13
      • 1970-01-01
      • 1970-01-01
      • 2018-02-14
      相关资源
      最近更新 更多