在Numpy中将1-D阵列添加到3-D阵列

时间:2015-08-29 07:26:20

标签: python arrays numpy vectorization numpy-broadcasting

我正在尝试添加两个数组。

np.zeros((6,9,20)) + np.array([1,2,3,4,5,6,7,8,9])

我希望得到像

这样的东西
array([[[ 1.,  1.,  1., ...,  1.,  1.,  1.],
        [ 2.,  2.,  2., ...,  2.,  2.,  2.],
        [ 3.,  3.,  3., ...,  3.,  3.,  3.],
        ..., 
        [ 7.,  7.,  7., ...,  7.,  7.,  7.],
        [ 8.,  8.,  8., ...,  8.,  8.,  8.],
        [ 9.,  9.,  9., ...,  9.,  9.,  9.]],

       [[ 1.,  1.,  1., ...,  1.,  1.,  1.],
        [ 2.,  2.,  2., ...,  2.,  2.,  2.],
        [ 3.,  3.,  3., ...,  3.,  3.,  3.],
        ..., 
        [ 7.,  7.,  7., ...,  7.,  7.,  7.],
        [ 8.,  8.,  8., ...,  8.,  8.,  8.],
        [ 9.,  9.,  9., ...,  9.,  9.,  9.]],

因此,在相应列的每个矩阵中添加条目。我知道我可以在某种循环中对其进行编码,但我正在尝试使用更优雅/更快的解决方案。

3 个答案:

答案 0 :(得分:6)

使用Nonebroadcasting扩展第二个数组的维度后,您可以使np.newaxis发挥作用 -

np.zeros((6,9,20))+np.array([1,2,3,4,5,6,7,8,9])[None,:,None]

答案 1 :(得分:4)

如果我理解正确,最好使用的是NumPy's Broadcasting。您可以通过以下方式获得所需内容:

np.zeros((6,9,20))+np.array([1,2,3,4,5,6,7,8,9]).reshape((1,9,1))

我更喜欢使用reshape method以Divakar显示的方式对索引使用切片表示法,因为我已经完成了将形状作为变量操作的相当多的工作,并且在变量中传递元组更容易一些而不是切片。你也可以这样做:

array1.reshape(array2.shape)

顺便说一下,如果你真的在寻找像沿着轴从0到N-1的数组一样简单的东西,那就看看mgrid。只需

即可获得上述输出
np.mgrid[0:6,1:10,0:20][1]

答案 2 :(得分:0)

您可以使用平铺(但您还需要使用交换轴来获得正确的形状)。

A = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
B = np.tile(A, (6, 20, 1))
C = np.swapaxes(B, 1, 2)