有效地总结1D NumPy阵列的外部产品

时间:2016-10-19 21:43:45

标签: python numpy optimization

我有一个

形式的功能

enter image description here

在numpy中实现此功能的一种方法是组合矩阵以求和:

y = a*b - np.sum(np.outer(a*b, b), axis=0)

有没有更好的方法用numpy实现这个功能,一个不涉及创建NxN数组?

1 个答案:

答案 0 :(得分:2)

您可以使用np.einsum -

y = a*b - np.einsum('i,i,j->j',a,b,b)

我们还可以执行a*b并将Feed提供给einsum -

y = a*b - np.einsum('i,j->j',a*b,b)

在第二种方法中,我们可以通过存储a*b并重复使用来保存一些运行时。

运行时测试 -

In [253]: a = np.random.rand(4000)

In [254]: b = np.random.rand(4000)

In [255]: %timeit np.sum(np.outer(a*b, b), axis=0)
10 loops, best of 3: 105 ms per loop

In [256]: %timeit np.einsum('i,i,j->j',a,b,b)
10 loops, best of 3: 24.2 ms per loop

In [257]: %timeit np.einsum('i,j->j',a*b,b)
10 loops, best of 3: 21.9 ms per loop