我会尝试回答问题的第二部分。
因此,我们正在与它进行比较:
A[np.all(np.any((A-B[:, None]), axis=2), axis=0)] (I)
and
A[~((A[:,None,:] == B).all(-1)).any(1)]
为了与第一个方法的匹配视角进行比较,我们可以这样写下第二种方法 -
A[(((~(A[:,None,:] == B)).any(2))).all(1)] (II)
考虑性能时的主要区别在于,对于第一个,我们通过减法得到不匹配,然后通过检查非零值.any()
. Thus, any()
用于对非布尔数据类型数组进行操作。在第二种方法中,我们向它提供一个布尔数组,该数组是通过A[:,None,:] == B
.
让我们做一个小的运行时测试来看看如何.any()
执行于int
数据类型与boolean array
-
In [141]: A = np.random.randint(0,9,(1000,1000)) # An int array
In [142]: %timeit A.any(0)
1000 loops, best of 3: 1.43 ms per loop
In [143]: A = np.random.randint(0,9,(1000,1000))>5 # A boolean array
In [144]: %timeit A.any(0)
10000 loops, best of 3: 164 µs per loop
所以,与接近9x
这部分的加速,我们看到了使用的巨大优势any()
与布尔数组。我认为这是使第二种方法更快的最大原因。