3 回答
TA贡献1847条经验 获得超11个赞
IIUC 您可以尝试以下操作并假设 B 始终是“索引”列表:
[i for i in B if i not in A]
输出将是:[0,4,5]
使用 numpy 做到这一点的最佳方法
Numpy 实际上有一个函数可以执行此操作:numpy.insetdiff1d
np.setdiff1d(B, A)
# Which returns
array([0, 4, 5])
TA贡献1802条经验 获得超10个赞
您可以使用enumerate
来获取列表的索引和内容。下面的代码会做你想要的
idx = [idx for idx, element in enumerate(B) if element not in A]
TA贡献1798条经验 获得超7个赞
我假设我们想要获得B, 与 相比时独有的元素A。
方法#1
鉴于 的具体情况 B is always from 0 to N with an interval of 1,我们可以使用一个简单的基于掩码的 -
mask = np.ones(len(B), dtype=bool)
mask[A] = False
out = B[mask]
方法#2
另一种B可以编辑并且内存效率更高的方法 -
B[A] = -1
out = 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]: A
Out[77]: array([ 1, 2, 3, 6, 7, 8, -6])
In [78]: B
Out[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.setdiff1d
In [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)
添加回答
举报