重塑numpy数组以包含原始数组中的逻辑逻辑块

时间:2016-11-11 15:22:53

标签: python arrays numpy multidimensional-array reshape

我的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来获得相同的结果?

提前致谢。

2 个答案:

答案 0 :(得分:3)

实际上它是(3, 3) (2, 2)数组的数组,因此首先将其重新整形为(3, 3, 2, 2)数组。

然后调换它以使轴适合重新组合成(6, 6)数组:

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

答案 1 :(得分:0)

我做了类似但也许更直观的事情:

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]])