numpy中的逐行乘法
Column-by-row multiplication in numpy
我有 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
?
您可以使用 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
如果您希望获得一个 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
只是让我们免于函数调用的开销,这可能会给我们带来一些性能改进。
我有 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
?
您可以使用 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
如果您希望获得一个 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
只是让我们免于函数调用的开销,这可能会给我们带来一些性能改进。