如何在NumPy中有效地计算列方向外向量

时间:2016-11-15 03:08:39

标签: python numpy

假设矩阵A的大小为m x rB的大小为n x r。在NumPy中,如何在AB之间执行按列排列的外部产品?

也就是说,我想要一个矩阵C(大小:m x n x r),其中C[:, :, i]A[:, i]B[:, i]的外积。

当然,我可以在列上使用for循环,但我想知道是否有一种矢量化方法可以快速进行计算?

1 个答案:

答案 0 :(得分:1)

我通常会在einsum上调用以便在以下情况下轻松进行矢量化:

>>> m,n,r = 30,50,70
>>> A = np.random.random((m,r))
>>> B = np.random.random((n,r))
>>> C = np.einsum('ik,jk->ijk', A, B)
>>> C2 = np.dstack([np.outer(A[:,i], B[:,i]) for i in range(r)])
>>> C.shape
(30, 50, 70)
>>> np.allclose(C, C2)
True

通过这种方式,我们可以明确地说明我们想要对每个坐标发生什么,同时仍然比循环更快:

>>> %timeit C = np.einsum('ik,jk->ijk', A, B)
The slowest run took 4.83 times longer than the fastest. This could mean that an intermediate result is being cached.
1000 loops, best of 3: 216 µs per loop

>>> %timeit C2 = np.dstack([np.outer(A[:,i], B[:,i]) for i in range(r)])
100 loops, best of 3: 2.08 ms per loop