如何将一维 NumPy 数组的元素添加到具有相同索引的 NumPy 子数组?

How to add elements of a 1D NumPy array to NumPy subarrays with the same index?

假设我有一个形状为 (3, 5, 7) 的 NumPy 数组 a 和一个形状为 (3, 1) 的一维 NumPy 数组 l。我想将 l 的第 0 个元素添加到 a 中的第 0 个子数组,将 l 的第一个元素添加到 a 的第一个子数组,以及 [=2] 的第二个元素=15=] 到 a.

的第二个也是最后一个子数组

例如,如果l = [[30 40 50]],那么我想要a[0] += 30a[1] += 40a[2] += 50

我知道要实现这一点,我可以轻松地执行以下操作:

for i in range(a.shape[0]):
    a[i] += l[i]

但我想知道是否有一种方法可以使用纯 NumPy 执行此操作,不需要 for 循环。尝试 np.add(a, l) 总是会产生错误 operands could not be broadcast together with shapes (3,5,7) (3,1) 并尝试以下操作:

def add_arrs(a, l):
    return a + l

a = np.apply_along_axis(add_arrs, 0, a, l)

给了我 (3, 3, 5, 7) 的最终形状,这不是我想要的。感谢您的帮助!

编辑: 我想通了:

a = np.apply_along_axis(np.add, 0, a, l.T)[0]

想通了,这里是答案:

a = np.apply_along_axis(np.add, 0, a, l.T)[0]
In [7]: a = np.arange(3*5*7).reshape(3,5,7)
In [8]: b = np.array([[30,40,50]])
In [9]: b.shape
Out[9]: (1, 3)

前导 1 维没有帮助;无论如何你都必须转置

In [10]: b = np.array([30,40,50])
In [11]: b.shape
Out[11]: (3,)

如果 b 是 (3,1,1) 形状,广播工作正常:

In [12]: a += b[:,None,None]
In [13]: a
Out[13]: 
array([[[ 30,  31,  32,  33,  34,  35,  36],
        [ 37,  38,  39,  40,  41,  42,  43],
        [ 44,  45,  46,  47,  48,  49,  50],
        [ 51,  52,  53,  54,  55,  56,  57],
        [ 58,  59,  60,  61,  62,  63,  64]],

       [[ 75,  76,  77,  78,  79,  80,  81],
        [ 82,  83,  84,  85,  86,  87,  88],
        [ 89,  90,  91,  92,  93,  94,  95],
        [ 96,  97,  98,  99, 100, 101, 102],
        [103, 104, 105, 106, 107, 108, 109]],

       [[120, 121, 122, 123, 124, 125, 126],
        [127, 128, 129, 130, 131, 132, 133],
        [134, 135, 136, 137, 138, 139, 140],
        [141, 142, 143, 144, 145, 146, 147],
        [148, 149, 150, 151, 152, 153, 154]]])