如何将一维 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] += 30
,a[1] += 40
,a[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]]])
假设我有一个形状为 (3, 5, 7)
的 NumPy 数组 a
和一个形状为 (3, 1)
的一维 NumPy 数组 l
。我想将 l
的第 0 个元素添加到 a
中的第 0 个子数组,将 l
的第一个元素添加到 a
的第一个子数组,以及 [=2] 的第二个元素=15=] 到 a
.
例如,如果l = [[30 40 50]]
,那么我想要a[0] += 30
,a[1] += 40
,a[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]]])