我有一个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]]])
答案 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]]])