沿 B 广播 A 的每一行,避免“重复”

broadcast each row of A along B, avoiding `repeat`

我有 2 个二维数组,其中 1 个轴的维度相同:

a = np.array(np.arange(6).reshape((2,3)))
b = np.array(np.arange(12).reshape((3,4)))

我想将a的每一行与b相乘广播,即

b_r = np.repeat(b[:,:,None], 2, axis=2)
ab = a.T[:,None,:] * b_r

是否可以在避开repeat的同时进行广播?这个想法是为了避免为 repeat 操作分配不必要的内存。

您可以只输入 b[:,:,None] 而无需重复,因为 broadcasting 及其定义会为您播放它。

因此,只需执行 -

ab = a.T[:,None,:]*b[:,:,None]

我们可以通过跳过 a 的尾随 : 并使用 ... 替换 b:,: 来使其紧凑一些,例如所以-

ab = a.T[:,None]*b[...,None]

对于 kicks,这是使用 np.einsum 的一个,它的性能会稍差一些,但一旦我们通过它的字符串表示法 -

ab = np.einsum('ij,jk->jki',a,b)