Преобразовать массив 4D numpy в 2D

У меня есть матрица (5,5,5,5), созданная с использованием numpy, которая выглядит так:

[[[[0.64 0.16 0.   0.   0.  ]
   [0.   0.64 0.16 0.   0.  ]
   [0.   0.   0.64 0.16 0.  ]
   [0.   0.   0.   0.64 0.16]
   [0.   0.   0.   0.   0.8 ]]

  [[0.16 0.04 0.   0.   0.  ]
   [0.   0.16 0.04 0.   0.  ]
   [0.   0.   0.16 0.04 0.  ]
   [0.   0.   0.   0.16 0.04]
   [0.   0.   0.   0.   0.2 ]]

  [[0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]]

  [[0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]]

  [[0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]]]


 [[[0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]]

  [[0.64 0.16 0.   0.   0.  ]
   [0.   0.64 0.16 0.   0.  ]
   [0.   0.   0.64 0.16 0.  ]
   [0.   0.   0.   0.64 0.16]
   [0.   0.   0.   0.   0.8 ]]

  [[0.16 0.04 0.   0.   0.  ]
   [0.   0.16 0.04 0.   0.  ]
   [0.   0.   0.16 0.04 0.  ]
   [0.   0.   0.   0.16 0.04]
   [0.   0.   0.   0.   0.2 ]]

  [[0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]]

  [[0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]]]


 [[[0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]]

  [[0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]]

  [[0.64 0.16 0.   0.   0.  ]
   [0.   0.64 0.16 0.   0.  ]
   [0.   0.   0.64 0.16 0.  ]
   [0.   0.   0.   0.64 0.16]
   [0.   0.   0.   0.   0.8 ]]

  [[0.16 0.04 0.   0.   0.  ]
   [0.   0.16 0.04 0.   0.  ]
   [0.   0.   0.16 0.04 0.  ]
   [0.   0.   0.   0.16 0.04]
   [0.   0.   0.   0.   0.2 ]]

  [[0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]]]


 [[[0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]]

  [[0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]]

  [[0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]]

  [[0.64 0.16 0.   0.   0.  ]
   [0.   0.64 0.16 0.   0.  ]
   [0.   0.   0.64 0.16 0.  ]
   [0.   0.   0.   0.64 0.16]
   [0.   0.   0.   0.   0.8 ]]

  [[0.16 0.04 0.   0.   0.  ]
   [0.   0.16 0.04 0.   0.  ]
   [0.   0.   0.16 0.04 0.  ]
   [0.   0.   0.   0.16 0.04]
   [0.   0.   0.   0.   0.2 ]]]


 [[[0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]]

  [[0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]]

  [[0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]]

  [[0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]
   [0.   0.   0.   0.   0.  ]]

  [[0.8  0.2  0.   0.   0.  ]
   [0.   0.8  0.2  0.   0.  ]
   [0.   0.   0.8  0.2  0.  ]
   [0.   0.   0.   0.8  0.2 ]
   [0.   0.   0.   0.   1.  ]]]]

Как мне эффективно преобразовать его в матрицу (25,25), первая строка которой является конкатенацией первых строк первых пяти (5,5) блоков, а вторая - конкатенацией вторых строк первых (5 , 5) блоки и тд? Например, учитывая мою входную матрицу, строка первый выходной матрицы должна быть:

[0.64 0.16  0.   0.   0.  0.16  0.04   0.   0.   0.   0.   0.   
0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   
0.  ]

в то время как строка шестой должна быть комбинацией первых строк с 6-го по 10-й блоки 5 на 5, то есть:

[0.   0.   0.   0.   0.  0.64  0.16   0.   0.   0.   0.16   
0.04   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   
0.  0.  ]

Я попробовал numpy.reshape (input, (25,25)), но не получил желаемого результата. Любая помощь приветствуется!

Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
1
0
941
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте swapaxes (или transpose), чтобы изменить порядок осей перед изменением формы:

In [48]: y = x.swapaxes(1,2).reshape(25,25)

In [49]: y[0]
Out[49]: 
array([0.64, 0.16, 0.  , 0.  , 0.  , 0.16, 0.04, 0.  , 0.  , 0.  , 0.  ,
       0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  ,
       0.  , 0.  , 0.  ])

In [50]: y[5]
Out[50]: 
array([0.  , 0.  , 0.  , 0.  , 0.  , 0.64, 0.16, 0.  , 0.  , 0.  , 0.16,
       0.04, 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  ,
       0.  , 0.  , 0.  ])

Это именно то, что я хочу. Спасибо!

Steven Chan 27.10.2018 03:32

Другие вопросы по теме