Numpy减去ndim相同但形状不同的两个数组

时间:2019-03-08 20:57:33

标签: python arrays numpy

所以我有两个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的功能类似,但尺寸较小,我不知道如何扩展它。

1 个答案:

答案 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) 

新轴的顺序决定了整形,因此要小心。