在以下问题中, /sf/answers/2803929481/
Numpy的广播提供的解决方案比使用与np.view()配对的np.setdiff1d()快6倍.它是如何设法做到这一点的?
并且使用A[~((A[:,None,:] == B).all(-1)).any(1)]速度更快.有趣,但提出了另一个问题.这表现得更好?
我会尝试回答问题的第二部分.
所以,有了它,我们正在比较:
A[np.all(np.any((A-B[:, None]), axis=2), axis=0)] (I)
Run Code Online (Sandbox Code Playgroud)
和
A[~((A[:,None,:] == B).all(-1)).any(1)]
Run Code Online (Sandbox Code Playgroud)
为了与第一个匹配的视角进行比较,我们可以写下这样的第二种方法 -
A[(((~(A[:,None,:] == B)).any(2))).all(1)] (II)
Run Code Online (Sandbox Code Playgroud)
考虑性能时的主要区别在于,对于第一个,我们通过减法得到非匹配,然后检查非零.any().因此,any()使得对非布尔dtype数组的数组进行操作.在第二种方法中,我们正在为它提供一个使用的布尔数组A[:,None,:] == B.
让我们做一个小的运行时测试来看看如何.any()在intdtype vs 上执行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
Run Code Online (Sandbox Code Playgroud)
因此,9x在这部分接近加速时,我们看到any()与布尔数组一起使用的巨大优势.我认为这是使第二种方法更快的最大原因.
| 归档时间: |
|
| 查看次数: |
388 次 |
| 最近记录: |