【问题标题】:combining 2D arrays to 3D arrays将 2D 数组组合到 3D 数组
【发布时间】:2013-09-03 14:59:13
【问题描述】:

您好,我有 3 个 numpy 数组,如下所示。

>>> print A
[[ 1.  0.  0.]
 [ 3.  0.  0.]
 [ 5.  2.  0.]
 [ 2.  0.  0.]
 [ 1.  2.  1.]]
>>> print B
[[  5.   9.   9.]
 [ 37.   8.   9.]
 [ 49.   8.   3.]
 [  3.   3.   1.]
 [  4.   4.   5.]]
>>> 
>>> print C
[[ 0.  0.  0.]
 [ 0.  6.  0.]
 [ 1.  4.  6.]
 [ 6.  2.  0.]
 [ 0.  5.  4.]]

我想把它们组合成

[[[  1.   0.   0.]
  [  5.   9.   9.]
  [  0.   0.   0.]]

 [[  3.   0.   0.]
  [ 37.   8.   9.]
  [  0.   6.   0.]]

 [[  5.   2.   0.]
  [ 49.   8.   3.]
  [  1.   4.   6.]]

 [[  2.   0.   0.]
  [  3.   3.   1.]
  [  6.   2.   0.]]

 [[  1.   2.   1.]
  [  4.   4.   5.]
  [  0.   5.   4.]]]

也就是说,我想从每个数组中取出一行。 谁能告诉我一个简单的方法来做到这一点? 我已经尝试过hstackvstack。但他们没有给出想要的结果。

谢谢!

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    使用np.stack 使这变得微不足道:

    >>> np.stack([A, B, C], axis=1)  # stack along a new axis in axis 1 of the result
    array([[[ 1,  0,  0],
            [ 5,  9,  9],
            [ 0,  0,  0]],
    
           [[ 3,  0,  0],
            [37,  8,  9],
            [ 0,  6,  0]],
    
           [[ 5,  2,  0],
            [49,  8,  3],
            [ 1,  4,  6]],
    
           [[ 2,  0,  0],
            [ 3,  3,  1],
            [ 6,  2,  0]],
    
           [[ 1,  2,  1],
            [ 4,  4,  5],
            [ 0,  5,  4]]])
    

    【讨论】:

      【解决方案2】:

      一个使用numpy的解决方案dstack

      >>> import numpy as np
      >>> np.dstack((a,b,c)).swapaxes(1,2)
      array([[[ 1,  0,  0],
              [ 5,  9,  9],
              [ 0,  0,  0]],
      
             [[ 3,  0,  0],
              [37,  8,  9],
              [ 0,  6,  0]],
      
             [[ 5,  2,  0],
              [49,  8,  3],
              [ 1,  4,  6]],
      
             [[ 2,  0,  0],
              [ 3,  3,  1],
              [ 6,  2,  0]],
      
             [[ 1,  2,  1],
              [ 4,  4,  5],
              [ 0,  5,  4]]])
      

      【讨论】:

        【解决方案3】:
        >>> np.hstack([a,b,c]).reshape((5,3,3))
        array([[[  1.,   0.,   0.],
                [  5.,   9.,   9.],
                [  0.,   0.,   0.]],
        
               [[  3.,   0.,   0.],
                [ 37.,   8.,   9.],
                [  0.,   6.,   0.]],
        
               [[  5.,   2.,   0.],
                [ 49.,   8.,   3.],
                [  1.,   4.,   6.]],
        
               [[  2.,   0.,   0.],
                [  3.,   3.,   1.],
                [  6.,   2.,   0.]],
        
               [[  1.,   2.,   1.],
                [  4.,   4.,   5.],
                [  0.,   5.,   4.]]])
        

        【讨论】:

        • 这大约是我的答案的两倍,+1!
        【解决方案4】:

        我想我得到了一些有用的东西:

        >>> print np.hstack([A[:, None, :], B[:, None, :], C[:, None, :]])
        [[[ 1  0  0]
          [ 5  9  9]
          [ 0  0  0]]
        
         [[ 3  0  0]
          [37  8  9]
          [ 0  6  0]]
        
         [[ 5  2  0]
          [49  8  3]
          [ 1  4  6]]
        
         [[ 2  0  0]
          [ 3  3  1]
          [ 6  2  0]]
        
         [[ 1  2  1]
          [ 4  4  5]
          [ 0  5  4]]]
        

        【讨论】:

          【解决方案5】:

          无需使用vstackhstack。只需使用np.swapaxes 交换轴即可:

          >>> d=array([a, b, c])
          >>> d
          array([[[ 1,  0,  0],
                  [ 3,  0,  0],
                  [ 5,  2,  0],
                  [ 2,  0,  0],
                  [ 1,  2,  1]],
          
                 [[ 5,  9,  9],
                  [37,  8,  9],
                  [49,  8,  3],
                  [ 3,  3,  1],
                  [ 4,  4,  5]],
          
                 [[ 0,  0,  0],
                  [ 0,  6,  0],
                  [ 1,  4,  6],
                  [ 6,  2,  0],
                  [ 0,  5,  4]]])
          >>> swapaxes(d, 0, 1)
          array([[[ 1,  0,  0],
                  [ 5,  9,  9],
                  [ 0,  0,  0]],
          
                 [[ 3,  0,  0],
                  [37,  8,  9],
                  [ 0,  6,  0]],
          
                 [[ 5,  2,  0],
                  [49,  8,  3],
                  [ 1,  4,  6]],
          
                 [[ 2,  0,  0],
                  [ 3,  3,  1],
                  [ 6,  2,  0]],
          
                 [[ 1,  2,  1],
                  [ 4,  4,  5],
                  [ 0,  5,  4]]])
          

          【讨论】:

            【解决方案6】:
            >>> import numpy as np
            >>> A = np.array([[1,0,0],[3,0,0],[5,2,0],[2,0,0],[1,2,1]])
            >>> B = np.array([[5,9,9],[37,8,9],[49,8,3],[3,3,1],[4,4,5]])
            >>> C = np.array([[0,0,0],[0,6,0],[1,4,6],[6,2,0],[0,5,4]])
            >>> np.array([A,B,C]).swapaxes(1,0)
            
            array([[[ 1,  0,  0],
                [ 5,  9,  9],
                [ 0,  0,  0]],
            
               [[ 3,  0,  0],
                [37,  8,  9],
                [ 0,  6,  0]],
            
               [[ 5,  2,  0],
                [49,  8,  3],
                [ 1,  4,  6]],
            
               [[ 2,  0,  0],
                [ 3,  3,  1],
                [ 6,  2,  0]],
            
               [[ 1,  2,  1],
                [ 4,  4,  5],
                [ 0,  5,  4]]])
            

            我使用 Ipython %%timeit 比较了答案:

            np.array([A,B,C]).swapaxes(1,0)
            100000 loops, best of 3: 18.2 us per loop
            
            np.dstack((A,B,C)).swapaxes(1,2)
            100000 loops, best of 3: 19.8 us per loop
            
            np.hstack([A,B,C]).reshape((5,3,3))
            100000 loops, best of 3: 14.8 us per loop
            
            np.hstack([A[:, None, :], B[:, None, :], C[:, None, :]])
            100000 loops, best of 3: 17.2 us per loop
            

            看起来@Viktor Kerkez 的回答最快。

            【讨论】:

            • 它对我有用 - 你能仔细检查一下吗?我已经更新了问题中给出的数字。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-04-07
            • 1970-01-01
            • 2012-12-09
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多