我有一个
形式的功能在numpy中实现此功能的一种方法是组合矩阵以求和:
y = a*b - np.sum(np.outer(a*b, b), axis=0)
有没有更好的方法用numpy实现这个功能,一个不涉及创建NxN数组?
答案 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