猿问

如何检查一个数组是否包含另一个数组的所有元素?

我需要检查数组 A 是否包含另一个数组 B 的所有元素。如果不包含,则输出缺少的元素。A和B都是整数,B总是从0到N,间隔为1。

import numpy as np
A=np.array([1,2,3,6,7,8,9])
B=np.arange(10)

我知道我可以使用以下内容来检查是否有任何丢失的元素,但它没有给出丢失元素的索引。

np.all(elem in A  for elem in B)

python中有没有一种好方法来输出缺失元素的索引?


拉风的咖菲猫
浏览 171回答 3
3回答

回首忆惘然

IIUC 您可以尝试以下操作并假设 B 始终是“索引”列表:[i for i in B if i not in A]输出将是:[0,4,5]使用 numpy 做到这一点的最佳方法Numpy 实际上有一个函数可以执行此操作:numpy.insetdiff1dnp.setdiff1d(B, A)# Which returnsarray([0, 4, 5])

守候你守候我

您可以使用enumerate来获取列表的索引和内容。下面的代码会做你想要的    idx = [idx for idx, element in enumerate(B) if element not in A]

元芳怎么了

我假设我们想要获得B, 与 相比时独有的元素A。方法#1鉴于 的具体情况 B is always from 0 to N with an interval of 1,我们可以使用一个简单的基于掩码的 -mask = np.ones(len(B), dtype=bool)mask[A] = Falseout = B[mask]方法#2另一种B可以编辑并且内存效率更高的方法 -B[A] = -1out = B[B>=0]方法#3更通用的整数情况可以用不同的方式处理 -def setdiff_for_ints(B, A):    N = max(B.max(), A.max()) - min(min(A.min(),B.min()),0) + 1    mask = np.zeros(N, dtype=bool)    mask[B] = True    mask[A] = False    out = np.flatnonzero(mask)    return out样本运行 -In [77]: AOut[77]: array([ 1,  2,  3,  6,  7,  8, -6])In [78]: BOut[78]: array([1, 3, 4, 5, 7, 9])In [79]: setdiff_for_ints(B, A)Out[79]: array([4, 5, 9])# Using np.setdiff1d to verify :In [80]: np.setdiff1d(B, A)Out[80]: array([4, 5, 9])时间安排 -In [81]: np.random.seed(0)    ...: A = np.unique(np.random.randint(-10000,100000,1000000))    ...: B = np.unique(np.random.randint(0,100000,1000000))# @Hugolmn's soln with np.setdiff1dIn [82]: %timeit np.setdiff1d(B, A)4.78 ms ± 96.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)In [83]: %timeit setdiff_for_ints(B, A)599 µs ± 6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
随时随地看视频慕课网APP

相关分类

Python
我要回答