numpy广播如何表现得更快?

R. *_*hna 6 python numpy

在以下问题中, /sf/answers/2803929481/

Numpy的广播提供的解决方案比使用与np.view()配对的np.setdiff1d()快6倍.它是如何设法做到这一点的?

并且使用A[~((A[:,None,:] == B).all(-1)).any(1)]速度更快.有趣,但提出了另一个问题.这表现得更好?

Div*_*kar 5

我会尝试回答问题的第二部分.

所以,有了它,我们正在比较:

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()与布尔数组一起使用的巨大优势.我认为这是使第二种方法更快的最大原因.