沿 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)
我有 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)