我需要将数组A的每一行与元素B的所有行相乘。例如,假设我们有以下数组:
A = np.array([[1,5],[3,6]])
B = np.array([[4,2],[8,2]])
我想得到以下数组C:
C = np.array([[4,10],[8,10],[12,12],[24,12]])
我可以通过使用for循环来做到这一点,但我认为可以有更好的方法来做到这一点。
编辑:我想重复和平铺,但我的阵列不是那么小。它可能会产生一些内存问题。
利用broadcasting
将A
的dims扩展到3D
的None/np.newaxis
,执行元素乘法并重新塑造回2D
-
(A[:,None]*B).reshape(-1,B.shape[1])
基本上是 -
(A[:,None,:]*B[None,:,:]).reshape(-1,B.shape[1])
示意性地说,它是:
A : M x 1 x N
B : 1 x K x N
out : M x K x N
最后重组合并最后两个轴并给我们(M x K*N)
形状的2D
阵列。
我们也可以使用einsum
在一个函数调用中执行3D
和元素乘法的扩展 -
np.einsum('ij,kj->ikj',A,B).reshape(-1,B.shape[1])