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 = 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 个回答
4
你想做的事情叫做“广播”,如果输入的数据形状合适,numpy会自动处理这个过程。你可以试试这个:
Arr1 = Arr1.reshape((100, 10, 1))
Arr2 = Arr2.reshape((100, 1, 5))
Arr3 = Arr1 + Arr2
我发现这个链接是一个很好的广播入门介绍,它会教你如何把这种行为扩展到多维数据。