在下面的问题中, https://stackoverflow.com/a/40056135/5714445
Numpy 的广播提供的解决方案比使用 np.setdiff1d() 和 np.view() 快近 6 倍。它是如何做到这一点的?
并使用 A[~((A[:,None,:] == B).all(-1)).any(1)]
进一步加速。
有趣,但提出了另一个问题。这如何表现得更好?
最佳答案
我会尝试回答问题的第二部分。
因此,我们正在与它进行比较:
A[np.all(np.any((A-B[:, None]), axis=2), axis=0)] (I)
和
A[~((A[:,None,:] == B).all(-1)).any(1)]
为了与第一个匹配的视角进行比较,我们可以像这样写下第二种方法 -
A[(((~(A[:,None,:] == B)).any(2))).all(1)] (II)
考虑性能时的主要区别在于,对于第一个,我们通过减法获得不匹配,然后使用 .any()
检查非零值。因此,any()
可以在非 bool dtype 数组的数组上进行操作。在第二种方法中,我们为它提供了一个通过 A[:,None,:] == B
获得的 bool 数组。
让我们做一个小的运行时测试,看看 .any()
在 int
dtype 与 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()
与 bool 数组一起使用的巨大优势。我认为这是使第二种方法更快的最大原因。
关于python - numpy 广播如何执行得更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40056275/