在第一轴上添加numpy 3d数组和1d数组

时间:2018-03-14 09:45:04

标签: python numpy

我有一个1d np数组“array1d”和一个3d np数组“array3d”,我想将它们相加,所以“array1d”中的第n个值将被添加到第n个平面的每个元素在array3d。

这可以在以下循环中完成

for i, value in enumerate(array1d):
    array3d[i] += value

问题是,如何在单一的numpy线中完成这项工作?

示例数组:

arr1d = np.array(range(3))
>>>array([0, 1, 2])

arr3d = np.array(range(27)).reshape(3, 3, 3)
>>>array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8]],

       [[ 9, 10, 11],
        [12, 13, 14],
        [15, 16, 17]],

       [[18, 19, 20],
        [21, 22, 23],
        [24, 25, 26]]])

想要的结果:

array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8]],

       [[ 10, 11, 12],
        [13, 14, 15],
        [16, 17, 18]],

       [[20, 21, 22],
        [23, 24, 25],
        [26, 27, 28]]])

1 个答案:

答案 0 :(得分:1)

使用Numpy的broadcasting features

In [23]: arr1d[:, None, None] + arr3d
Out[23]: 
array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8]],

       [[10, 11, 12],
        [13, 14, 15],
        [16, 17, 18]],

       [[20, 21, 22],
        [23, 24, 25],
        [26, 27, 28]]])

这基本上将arr1d的内容复制到其他两个维度(没有实际复制,它只提供了一个看起来像它的内存视图)。您也可以使用numpy.newaxis代替None

或者,您也可以使用reshape

In [32]: arr1d.reshape(3, 1, 1) + arr3d
Out[32]: 
array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8]],

       [[10, 11, 12],
        [13, 14, 15],
        [16, 17, 18]],

       [[20, 21, 22],
        [23, 24, 25],
        [26, 27, 28]]])