假设矩阵A
的大小为m x r
,B
的大小为n x r
。在NumPy
中,如何在A
和B
之间执行按列排列的外部产品?
也就是说,我想要一个矩阵C
(大小:m x n x r
),其中C[:, :, i]
是A[:, i]
和B[:, i]
的外积。
当然,我可以在列上使用for
循环,但我想知道是否有一种矢量化方法可以快速进行计算?
答案 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