我有2个矩阵A
(mxn
)和B
(nxm
)。我想得到矩阵C
(nxmxm
),这样C[i]=A[:, i].dot(B[i, :])
。换句话说,我想得到矩阵,其中第一个元素是A
的第一列的点和B
的第一行,第二个元素是A
和第二行的第二列的点B
等
例如,对于此类A
和B
A = np.array([[1, 2, 3], [0, 1, -1]])
B = np.array([[4, 5], [6, 7], [8, 9]])
我想有这样的矩阵:
C = np.array([[[4, 5], [0, 0]],
[[12, 14], [6, 7]],
[[24, 27], [-8, -9]]])
没有周期可能吗?如果没有,案例A = B.T
是否可能?
答案 0 :(得分:3)
您可以使用np.einsum
:
np.einsum('ij,jk->ijk', A, B)
array([[[ 4, 5],
[12, 14],
[24, 27]],
[[ 0, 0],
[ 6, 7],
[-8, -9]]])
来自你的评论:
np.einsum('ij,jk->jik', A, B)
会为您提供所需的C
答案 1 :(得分:0)
如果您希望获得3D元素乘法的3D数组,而不是矩阵乘法(涉及sum-reduction
),您可以使用broadcasting
以矢量化方式执行这些乘法运算,就像这样 -
A.T[...,None] * B[:,None]
运行时测试 -
In [524]: # Setup inputs
...: m,n = 200,200
...: A = np.random.rand(m,n)
...: B = np.random.rand(n,m)
...:
In [525]: %timeit np.einsum('ij,jk->jik', A, B) #@Saullo Castro's soln
10 loops, best of 3: 27.1 ms per loop
In [526]: %timeit A.T[...,None] * B[:,None]
10 loops, best of 3: 25.1 ms per loop
如果不需要任何sum-reduction
,直接broadcasting
只会将我们从函数调用开销中拯救出来,这可能会给我们带来一些性能提升。