3 回答

TA貢獻1847條經(jīng)驗 獲得超11個贊
IIUC 您可以嘗試以下操作并假設(shè) B 始終是“索引”列表:
[i for i in B if i not in A]
輸出將是:[0,4,5]
使用 numpy 做到這一點的最佳方法
Numpy 實際上有一個函數(shù)可以執(zhí)行此操作:numpy.insetdiff1d
np.setdiff1d(B, A)
# Which returns
array([0, 4, 5])

TA貢獻1802條經(jīng)驗 獲得超10個贊
您可以使用enumerate
來獲取列表的索引和內(nèi)容。下面的代碼會做你想要的
idx = [idx for idx, element in enumerate(B) if element not in A]

TA貢獻1798條經(jīng)驗 獲得超7個贊
我假設(shè)我們想要獲得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可以編輯并且內(nèi)存效率更高的方法 -
B[A] = -1
out = B[B>=0]
方法#3
更通用的整數(shù)情況可以用不同的方式處理 -
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)
添加回答
舉報