用python计算向量中每一个4元素乘积



我有一个(500000,30)numpy数组,我们可以把它看作一个长度为500000,大小为30的向量列表。我想在向量中任意选择4个元素,计算它们的乘积,并存储所有的4元素乘积。最后,我需要计算500000个结果的平均值。

我已经尝试过np.einsum,但它运行得很慢。我怎样才能提高效率?

# array.shape = (500000,30)
expect = np.sum(np.einsum('ni,nj,nk,nr->ijkr',array,array,array,array),axis=0)/500000

向量v中4个元素的所有可能乘积的和等于v中4个元素的和的4次方。注意,这假设相同的向量项可以在一个乘积中出现多次,并且总和将包括仅因其条目顺序不同的乘积(例如,v[1] * v[2] * v[3] * v[4]v[4] * v[3] * v[2] * v[1]将被视为不同的乘积)。由于您的代码执行相同的计算,我假设这是您想要的。无论如何,

的值
np.sum(np.einsum('ni,nj,nk,nr->ijkr', array, array, array, array))

相同
(array.sum(axis=1)**4).sum()

,但后者的计算速度要快得多。

在你的代码中,你正在沿着np.einsum产生的30x30x30x30数组的0轴求和,但我不确定为什么。

通过对点积进行因式分解可以更有效地计算出解在最后一个维度。此外,您可以告诉Numpy优化einsum(代价是更高的延迟,这在这里不是问题)。结果代码如下:

expect = np.einsum('n,nj,nk,nr->jkr',np.sum(array, axis=1),array,array,array,optimize=True)/500000

这是快63倍在我的机器上。如果您想进一步优化,那么您可以在并行中执行计算。使用多个线程。实际上,默认的Numpy实现是顺序的。您可以使用Numba这样做。我希望在我的6核机器上计算速度快360倍(因为计算是计算约束)。

相关内容

最新更新