所以我有两个ndarray:
形状为(N,a,a)的A,基本上是由N个形状为(a,a)的数组组成的堆栈
形状为(8,M,a,a)的B,是由8 x M个形状为(a,a)的阵列组成的矩阵
我需要从A(A-B)中减去B,以使所得数组的形状为(8,M * N,a,a)。 更确切地说,需要从A中的每个阵列中减去B的8个阵列中的每个(总共M个),从而导致在(a,a)个形状阵列之间相减8 * M * N。
我该如何以向量化的方式执行此操作而没有循环? thread的功能类似,但尺寸较小,我不知道如何扩展它。
答案 0 :(得分:2)
A = np.arange(8).reshape(2,2,2)
B = np.ones(shape=(8,4,2,2))
如果尺寸相同或一个尺寸为1,则常规广播将起作用,因此我们可以这样做;
a = A[np.newaxis, :, np.newaxis, :, :]
b = B[:, np.newaxis, :, :, :]
a.shape # <- (1,2,1,2,2)
b.shape # <- (8,1,4,2,2)
现在什么时候可以广播
c = a - b
c.shape # <- (8,2,4,2,2)
当您重塑形状时(2x4 = 8)组件会对齐。
c.reshape(8,-1,2,2)
新轴的顺序决定了整形,因此要小心。