python - numpy 广播如何执行得更快?

标签 python numpy

在下面的问题中, 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/

相关文章:

python - 我需要找到两组横滚角和偏航角之间的角度

Python/Pandas - 当某些列表可能少于 5 个值时,如何将列表切片到前 5 个值?

python - 如何在 Tensorflow 多 GPU 案例中使用 feed_dict

python - 比较 2 个 numpy 数组

python - 使用 NumPy 。关于数字或替代数组的 binary_repr - Python

python - 根据另一个数组中的 ID 值高效处理一个数组中的值

python - 具有现有 Python 安装的 Anaconda3

python - 使用旧字典中长度最长的键和值创建一个新字典,如何同时递增变量?

python - 如何使用 numpy 生成具有选定空间分布的噪声?

python - 将值与 numpy 中的相邻元素进行比较