Python, Numpy,多维数组相加的方法(广播)



我有许多不同大小的数组,它们有一个共同的索引。

例如

Arr1 = np.arange(0, 1000, 1).reshape(100, 10)
Arr2 = np.arange(0, 500, 1).reshape(100,5)
Arr1.shape = (100, 10)
Arr2.shape = (100, 5)

我想把它们加到一个新的数组Arr3中,Arr3是三维的。例如

Arr3 = Arr1 + Arr2
Arr3.shape = (100, 10, 5)

注意,在这种情况下,值应该对齐,例如

Arr3[10, 3, 2] =  Arr1[10, 3] + Arr2[10, 2]

我一直在尝试使用以下方法

test = Arr1.copy()
test = test[:, np.newaxis] + Arr2

现在,我已经能够在将两个方阵相加时使其工作。

m = np.arange(0, 100, 1)
[x, y] = np.meshgrid(x, y)
x.shape = (100, 100)
test44 = x.copy()
test44 = test44[:, np.newaxis] + x
test44.shape = (100, 100, 100)
test44[4, 3, 2] = 4
x[4, 2] = 2
x[3, 2] = 2

然而,在我的实际程序中,我将不会有这个问题的方阵。此外,当您开始按如下方式向上移动维数时,这种方法非常占用内存。

test44 = test44[:, :, np.newaxis] + x
test44.shape = (100, 100, 100, 100)
# Note this next command will fail with a memory error on my computer.
test44 = test44[:, :, :, np.newaxis] + x

我的问题有两个部分:

  1. 是否有可能从两个具有共同"共享"轴的不同形状的2D数组创建3D数组?
  2. 这种方法在高阶维度上是可扩展的吗?

感谢您的帮助

是的,你要做的是所谓的广播,它是由numpy自动完成,如果输入有正确的形状。试试这个:

Arr1 = Arr1.reshape((100, 10, 1))
Arr2 = Arr2.reshape((100, 1, 5))
Arr3 = Arr1 + Arr2

我发现这是一个非常好的广播入门,它应该向你展示如何将这种行为扩展到n维。

最新更新