我有 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)
关于python - 沿 B 广播 A 的每一行,避免 `repeat`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43605380/