【问题标题】:python: check if an numpy array contains any element of another arraypython:检查一个numpy数组是否包含另一个数组的任何元素
【发布时间】:2016-03-23 23:19:59
【问题描述】:

检查一个 numpy 数组是否包含另一个数组的任何元素的最佳方法是什么?

示例:

array1 = [10,5,4,13,10,1,1,22,7,3,15,9]
array2 = [3,4,9,10,13,15,16,18,19,20,21,22,23]`

如果array1 包含array2 的任何值,我想获得True,否则为False

【问题讨论】:

  • 使用np.any(np.in1d(array2, array1))

标签: python numpy


【解决方案1】:

使用熊猫,你可以使用isin

a1 = np.array([10,5,4,13,10,1,1,22,7,3,15,9])
a2 = np.array([3,4,9,10,13,15,16,18,19,20,21,22,23])

>>> pd.Series(a1).isin(a2).any()
True

并使用in1d numpy 函数(根据@Norman 的评论):

>>> np.any(np.in1d(a1, a2))
True

对于本例中的小型数组,使用 set 的解决方案显然是赢家。对于更大的不同数组(即没有重叠),Pandas 和 Numpy 解决方案更快。但是,np.intersect1d 似乎更适合更大的数组。

小数组(12-13 个元素)

%timeit set(array1) & set(array2)
The slowest run took 4.22 times longer than the fastest. This could mean that an intermediate result is being cached 
1000000 loops, best of 3: 1.69 µs per loop

%timeit any(i in a1 for i in a2)
The slowest run took 12.29 times longer than the fastest. This could mean that an intermediate result is being cached 
100000 loops, best of 3: 1.88 µs per loop

%timeit np.intersect1d(a1, a2)
The slowest run took 10.29 times longer than the fastest. This could mean that an intermediate result is being cached 
100000 loops, best of 3: 15.6 µs per loop

%timeit np.any(np.in1d(a1, a2))
10000 loops, best of 3: 27.1 µs per loop

%timeit pd.Series(a1).isin(a2).any()
10000 loops, best of 3: 135 µs per loop

使用包含 100k 个元素的数组(无重叠)

a3 = np.random.randint(0, 100000, 100000)
a4 = a3 + 100000

%timeit np.intersect1d(a3, a4)
100 loops, best of 3: 13.8 ms per loop    

%timeit pd.Series(a3).isin(a4).any()
100 loops, best of 3: 18.3 ms per loop

%timeit np.any(np.in1d(a3, a4))
100 loops, best of 3: 18.4 ms per loop

%timeit set(a3) & set(a4)
10 loops, best of 3: 23.6 ms per loop

%timeit any(i in a3 for i in a4)
1 loops, best of 3: 34.5 s per loop

【讨论】:

  • 我在评论中交换了数组。我更正了。
  • @Norman 顺序重要吗?如果我们要测试它们是否共享一个值,我不这么认为。
  • 那么np.intersect1d 呢?我刚刚找到了。
【解决方案2】:

你可以试试这个

>>> array1 = [10,5,4,13,10,1,1,22,7,3,15,9]
>>> array2 = [3,4,9,10,13,15,16,18,19,20,21,22,23]
>>> set(array1) & set(array2)
set([3, 4, 9, 10, 13, 15, 22])

如果你得到结果意味着两个数组中有共同的元素。

如果结果为空,则表示没有公共元素。

【讨论】:

    【解决方案3】:

    您可以使用any 内置函数和列表推导:

    >>> array1 = [10,5,4,13,10,1,1,22,7,3,15,9]
    >>> array2 = [3,4,9,10,13,15,16,18,19,20,21,22,23]
    >>> any(i in array2 for i in array1)
    True
    

    【讨论】:

      猜你喜欢
      • 2022-01-09
      • 1970-01-01
      • 2023-03-08
      • 2020-11-21
      • 2017-03-03
      • 1970-01-01
      相关资源
      最近更新 更多