我有2个2D阵列,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
操作的不必要的内存分配。
答案 0 :(得分:5)
您可以直接输入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)