将一个一维数组添加到Numpy中的三维数组中

6

我正试图将两个数组相加。

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.]],

需要在对应列添加每个矩阵的条目。我知道可以使用某种类型的循环进行编码,但我试图使用更优雅/更快的解决方案。


输出数组的形状必须是什么? - Divakar
对于这个例子,它需要保持3-D数组的形状,因此为6、9、20。 - psh5017
你不会得到一个形状为(6,9,20)的输出,像array([[[ 1., 2., 3., ..., 7., 8., 9.],...,因为期望输出中的最后一个维度似乎只有9个元素而不是20个。 - Divakar
3个回答

6
您可以通过使用 Nonenp.newaxis 扩展第二个数组的维度,然后运用 broadcasting,实现操作。
np.zeros((6,9,20))+np.array([1,2,3,4,5,6,7,8,9])[None,:,None]

4

如果我理解正确,最好使用的是NumPy的广播。您可以使用以下内容获得所需内容:

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

我更喜欢使用重塑方法而不是Divakar所展示的切片符号来操作索引,因为我经常需要操作形状作为变量,并且使用元组在变量之间传递数据会更加方便。你也可以像这样做:

array1.reshape(array2.shape)

顺便提一下,如果你真的想要一个从0到N-1沿着某个轴运行的数组,可以看看mgrid。你只需要使用以下代码即可获得上述输出:
np.mgrid[0:6,1:10,0:20][1]

0
你可以使用tile(但你还需要使用swapaxes来获得正确的形状)。
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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接