我正在寻找一种“最佳”方法来计算给定向量元素的所有两两乘积。如果向量的大小为N
,则输出将是一个大小为N * (N + 1) // 2
的向量,并包含所有(i, j)
对的i <= j
值。简单的计算方法如下:
import numpy as np
def get_pairwise_products_naive(vec: np.ndarray):
k, size = 0, vec.size
output = np.empty(size * (size + 1) // 2)
for i in range(size):
for j in range(i, size):
output[k] = vec[i] * vec[j]
k += 1
return output
德西德拉塔:
我一直在使用outer
、triu_indices
和einsum
等例程以及一些索引/视图技巧,但未能找到符合上述要求的解决方案
您还可以将此算法并行化。如果可以只分配一次足够大的阵列(该阵列上较小的视图几乎不需要任何成本),然后覆盖它,则可以实现更大的加速
示例
计时
我可能会计算M=vTv,然后展平该矩阵的较低或较高三角形部分
我还想提到^{} ,这将使您的“幼稚”方法很可能比此方法更快
仅测试上述
pairwise_products(np.arange(5000))
需要约0.3秒,而numba版本需要约0.05秒(忽略用于及时编译函数的第一次运行)方法#1
对于带有NumPy的向量化的一个,您可以在获得所有带有外部乘法的两两乘法后使用掩蔽一个,如下所示-
方法#2
对于真正大的输入1D数组,我们可能需要使用迭代
slicing
方法,该方法使用一个循环-基准测试
我们将在设置中包括^{} and ^{} from @orlp's solution
使用^{} 包(打包在一起的一些基准测试工具;免责声明:我是它的作者)对建议的解决方案进行基准测试
结果(超过
pairwise_products
的计时和加速)——从绘图趋势可以看出,对于真正大型的阵列,基于切片的阵列将开始获胜,否则矢量化阵列将表现出色
建议
numexpr
,以便对大型数组更有效地执行外部乘法李>相关问题 更多 >
编程相关推荐