【问题标题】:Reshape numpy array to contain logical blocks of values from original array重塑 numpy 数组以包含来自原始数组的值的逻辑块
【发布时间】:2017-03-25 20:43:40
【问题描述】:

我的 google-fu 让我失望了!

我有一个numpy数组如下:

    0     1     2     3
  ------------------------
0 | 100   110   120   130   
1 | 140   150   160   170
2 | 180   190   200   210
3 | 220   230   240   250
4 | 260   270   280   290
5 | 300   310   320   330
6 | 340   350   360   370
7 | 380   390   400   410
8 | 420   430   440   450

其形状为(9, 4)。我想将上面的数组重塑为以下(6, 6)数组:

    0     1     2     3     4     5
  -------------------------------------
0 | 100   110 | 140   150 | 180   190
1 | 120   130 | 160   170 | 200   210
  -------------------------------------
2 | 220   230 | 260   270 | 300   310
3 | 240   250 | 280   290 | 320   330
  -------------------------------------
4 | 340   350 | 380   390 | 420   430
5 | 360   370 | 400   410 | 440   450

我可以通过 2 个for 循环和一些条件来完成。有没有更好的方法在一行代码中使用numpy.reshape 来实现相同的结果?

提前致谢。

【问题讨论】:

    标签: python arrays numpy multidimensional-array reshape


    【解决方案1】:

    我做了类似但可能更直观的事情:

    a = np.arange(36).reshape([9,4])
    >>>
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11],
           [12, 13, 14, 15],
           [16, 17, 18, 19],
           [20, 21, 22, 23],
           [24, 25, 26, 27],
           [28, 29, 30, 31],
           [32, 33, 34, 35]])
    
    b = np.hstack(np.column_stack(a.reshape([3,3,2,2])))
    >>>
    array([[ 0,  1,  4,  5,  8,  9],
           [ 2,  3,  6,  7, 10, 11],
           [12, 13, 16, 17, 20, 21],
           [14, 15, 18, 19, 22, 23],
           [24, 25, 28, 29, 32, 33],
           [26, 27, 30, 31, 34, 35]])
    

    【讨论】:

      【解决方案2】:

      实际上它是一个(2, 2) 数组的(3, 3) 数组,所以首先将它重塑为一个(3, 3, 2, 2) 数组。

      然后转置它,使轴适合将其重新组合成 (6, 6) 数组:

      a.reshape(3, 3, 2, 2).transpose([0,2,1,3]).reshape(6,6)
      

      【讨论】:

      • 这会创建额外的维度。有没有办法让形状变成 (6,6) 而不是 (3,3,2,2)?
      • 您绘制的线条是附加尺寸。还是要重新连接它再次成为(6, 6) 数组?
      • 这些线条仅用于说明。有没有办法重新连接它成为(6,6)数组?非常感谢!
      • 现在转置一些轴,并重塑。实验。 transpose(...,[0,2,1,3]) 是我的第一个猜测。
      • a.transpose([0,2,1,3]).reshape(6,6) 工作!谢谢
      猜你喜欢
      • 2018-02-17
      • 1970-01-01
      • 1970-01-01
      • 2016-02-10
      • 1970-01-01
      • 1970-01-01
      • 2021-03-15
      • 1970-01-01
      • 2020-07-11
      相关资源
      最近更新 更多