【问题标题】:transfer 3D NumPy array into a 2D NumPy array将 3D NumPy 数组转换为 2D NumPy 数组
【发布时间】:2021-12-29 23:03:09
【问题描述】:

假设是一个 NumPy 数组

a = np.array(
    [[[1,2,3],
      [4,5,6]],
     [[7,8,9],
      [10,11,12]]])

形状会像 (2,2,3)。 我想让它看起来像这样:

a = np.array(
[[1,2,3],
 [7,8,9],
 [4,5,6],
 [10,11,12]]
)

哪个形状会像 (4,3)。 如果我使用 reshape,它看起来像:

a = np.array(
[[1,2,3],
 [4,5,6],
 [7,8,9], 
 [10,11,12]]
)

这不是我想要的。如何做到这一点?

【问题讨论】:

  • 交换第一和第二轴然后重塑:a.swapaxes(0, 1).reshape(-1, 3)
  • 亲爱的@PennYan,如果任何答案有帮助,请考虑upvoting it。回答者将是encouraging。

标签: python arrays numpy


【解决方案1】:

使用numpy.stack 和vstack 的一种方式:

np.vstack(np.stack(a, 1))

输出:

array([[ 1,  2,  3],
       [ 7,  8,  9],
       [ 4,  5,  6],
       [10, 11, 12]])

【讨论】:

    【解决方案2】:

    通过使用索引方法,可以创建一个idx 列表,指定前a 的哪些索引必须放置在新索引中,即idx 是一个重新排列列表:

    idx = [0, 2, 1, 3]
    a = a.reshape(4, 3)[idx]
    

    a首先被重新整形为预期的形状,即(4,3),然后由idx重新排列。 idx[1] = 2 显示前a 的index = 2 中的值将替换为新a 中的index = 1。

    【讨论】:

      【解决方案3】:

      这是您的问题的更 Pythonic 版本。 这使用连接所以附加你的数组的行。

      a = np.array(
          [[[1,2,3],
            [4,5,6]],
           [[7,8,9],
            [10,11,12]]]
      )
      
      def transform_2d(a_arr):
          nrow = len(a[:])
          all = a_arr[:,0]
          for i in range(1,nrow):
              all = np.concatenate((all, a_arr[:,i] ))
          return all
      
      print(transform_2d(a))
      

      【讨论】:

      • 我试过了,但我担心 reshape 只能帮助形状而不是结果。
      • 对不起。也许我没有表达清楚。我再次编辑了我的问题。
      • 注意,我为您的问题添加了一个易于阅读的功能。这只是逐行组合所有数组。
      • 重复concatenate 效率不高numpy 最好重复将列附加到列表中,并在末尾添加一个concatenate。
      【解决方案4】:

      首先使用transpose(或swapaxes)将欲望行放在一起:

      In [268]: a.transpose(1,0,2)
      Out[268]: 
      array([[[ 1,  2,  3],
              [ 7,  8,  9]],
      
             [[ 4,  5,  6],
              [10, 11, 12]]])
      

      然后重塑如下:

      In [269]: a.transpose(1,0,2).reshape(-1,3)
      Out[269]: 
      array([[ 1,  2,  3],
             [ 7,  8,  9],
             [ 4,  5,  6],
             [10, 11, 12]])
      

      【讨论】:

        猜你喜欢
        • 2019-10-31
        • 1970-01-01
        • 2017-07-26
        • 2011-05-19
        • 2017-07-27
        • 2015-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多