【问题标题】:Adding a 1-D Array to a 3-D array in Numpy在 Numpy 中将 1-D 数组添加到 3-D 数组
【发布时间】:2015-11-23 20:40:37
【问题描述】:

我正在尝试添加两个数组。

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

因此,在相应列的每个矩阵中添加条目。我知道我可以在某种循环中对其进行编码,但我正在尝试使用更优雅/更快的解决方案。

【问题讨论】:

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

标签: python arrays numpy vectorization array-broadcasting


【解决方案1】:

您可以在使用Nonenp.newaxis 扩展第二个数组的维度后使用broadcasting,就像这样 -

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

【讨论】:

    【解决方案2】:

    如果我理解正确,最好使用NumPy's Broadcasting。你可以通过以下方式得到你想要的:

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

    我更喜欢使用 reshape method 来使用 Divakar 显示的索引的切片表示法,因为我已经做了很多工作来将形状作为变量进行操作,并且在变量中传递元组比切片更容易一些.你也可以这样做:

    array1.reshape(array2.shape)
    

    顺便说一句,如果您真的在寻找像沿轴从 0 到 N-1 运行的数组这样简单的东西,请查看 mgrid。您只需

    即可获得上述输出
    np.mgrid[0:6,1:10,0:20][1]
    

    【讨论】:

      【解决方案3】:

      您可以使用瓷砖(但您还需要交换轴来获得正确的形状)。

      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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-29
        • 1970-01-01
        • 2018-04-19
        • 1970-01-01
        • 1970-01-01
        • 2019-03-29
        相关资源
        最近更新 更多