【问题标题】:How to make a 2d numpy array a 3d array?如何使 2d numpy 数组成为 3d 数组?
【发布时间】:2011-11-14 09:33:39
【问题描述】:

我有一个形状为 (x, y) 的 2d 数组,我想将其转换为形状为 (x, y, 1) 的 3d 数组。有没有很好的 Pythonic 方式来做到这一点?

【问题讨论】:

    标签: python multidimensional-array numpy


    【解决方案1】:

    简单的方法,有一些数学运算

    首先你知道数组元素的数量,比如说 100 然后将 100 分为 3 个步骤,例如:

    25 * 2 * 2 = 100

    或:4 * 5 * 5 = 100

    import numpy as np
    D = np.arange(100)
    # change to 3d by division of 100 for 3 steps 100 = 25 * 2 * 2
    D3 = D.reshape(2,2,25) # 25*2*2 = 100
    

    另一种方式:

    another_3D = D.reshape(4,5,5)
    print(another_3D.ndim)
    

    到 4D:

    D4 = D.reshape(2,2,5,5)
    print(D4.ndim)
    

    【讨论】:

      【解决方案2】:

      你可以通过重塑来做到这一点

      例如,您有一个形状为 35 x 750(二维)的数组 A,您可以使用 A.reshape(35, 25, 30) 将形状更改为 35 x 25 x 30(三维)

      更多在文档here

      【讨论】:

        【解决方案3】:

        如果您只想将第三轴 (x,y) 添加到 (x,y,1),Numpy 允许您使用 dstack 命令轻松完成此操作。

        import numpy as np
        a = np.eye(3) # your matrix here
        b = np.dstack(a).T
        

        您需要转置 (.T) 以将其转换为所需的 (x,y,1) 格式。

        【讨论】:

          【解决方案4】:
          import numpy as np
          
          # create a 2D array
          a = np.array([[1,2,3], [4,5,6], [1,2,3], [4,5,6],[1,2,3], [4,5,6],[1,2,3], [4,5,6]])
          
          print(a.shape) 
          # shape of a = (8,3)
          
          b = np.reshape(a, (8, 3, -1)) 
          # changing the shape, -1 means any number which is suitable
          
          print(b.shape) 
          # size of b = (8,3,1)
          

          【讨论】:

            【解决方案5】:

            希望这个功能可以帮助您将 2D 数组转换为 3D 数组。

            Args:
              x: 2darray, (n_time, n_in)
              agg_num: int, number of frames to concatenate. 
              hop: int, number of hop frames. 
            
            Returns:
              3darray, (n_blocks, agg_num, n_in)
            
            
            def d_2d_to_3d(x, agg_num, hop):
            
                # Pad to at least one block. 
                len_x, n_in = x.shape
                if (len_x < agg_num): #not in get_matrix_data
                    x = np.concatenate((x, np.zeros((agg_num - len_x, n_in))))
            
                # main 2d to 3d. 
                len_x = len(x)
                i1 = 0
                x3d = []
                while (i1 + agg_num <= len_x):
                    x3d.append(x[i1 : i1 + agg_num])
                    i1 += hop
            
                return np.array(x3d)
            

            【讨论】:

              【解决方案6】:

              除了其他答案,你还可以使用切片numpy.newaxis

              >>> from numpy import zeros, newaxis
              >>> a = zeros((6, 8))
              >>> a.shape
              (6, 8)
              >>> b = a[:, :, newaxis]
              >>> b.shape
              (6, 8, 1)
              

              甚至这个(可以使用任意数量的维度):

              >>> b = a[..., newaxis]
              >>> b.shape
              (6, 8, 1)
              

              【讨论】:

              • 在旁注中,numpy.newaxis 只是Nonenewaxis 只是为了便于阅读。相当于只做b = a[..., None](省略号还允许它适用于 N 维数组,而不仅仅是二维数组。)
              • 是的。出于某种原因,我的印象是 newaxis 成为 None 只是一个实现细节(因此将来可能会发生变化),但它看起来像是明确记录在案的。
              • 假设您希望第三个轴不是 1?例如你如何将a 转换为bb.shape = (6,8,3)
              • @Gathide:这取决于。您的旧数组中有 6*8 = 48 数字。新的有6*8*3 = 144 号码。你想如何将原来的 48 个数字映射到你的新数组中?沿第三轴重复?在这种情况下,大多数时候您不必为重复而烦恼:将其保留为 shape (6, 8, 1) 并利用 NumPy 的广播能力。但如果你真的需要形状(6, 8, 3),请查看np.tilenp.broadcast_to
              • @Gathide 正如 Mark Dickinson 所说,您可以使用 np.broadcast_to 来做到这一点,例如 b = np.broadcast_to(a[..., np.newaxis], (6, 8, 3))
              【解决方案7】:
              numpy.reshape(array, array.shape + (1,))
              

              【讨论】:

              • 谢谢,我用了 A = A.reshape(A.shape + (1,))
              • 如果您愿意修改A,您可以简单地分配给形状属性:A.shape = A.shape + (1,),甚至A.shape += 1,
              • 假设我有一个 3D [1000,10,5] 数组,我想将其转换为形状为 [1000, 50] 的 2D,例如连接第 2 和第 3 个初始维度。在这种情况下reshape 好吗?
              • @serafeim,当然。
              • 谢谢。我注意到预期的结果是当我在np.reshape 中使用order='F' 时。如果没有指定order='F',那么在我的情况下输出是错误的
              【解决方案8】:
              import numpy as np
              
              a= np.eye(3)
              print a.shape
              b = a.reshape(3,3,1)
              print b.shape
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2021-12-29
                • 2016-06-01
                • 1970-01-01
                • 2017-07-27
                • 2017-09-18
                • 2019-10-31
                • 2012-12-09
                相关资源
                最近更新 更多