Как преобразовать мой 4D-np.array в 2D-матрицу и сохранить структуру?

#python #numpy #matplotlib

#python #numpy #matplotlib

Вопрос:

Допустим, у меня есть 4D np.array, который состоит из 4 групп матриц 4×4:

 array([[[[1., 1.],
         [1., 1.]],

        [[2., 2.],
         [2., 2.]],

        [[3., 3.],
         [3., 3.]],

        [[4., 4.],
         [4., 4.]]],


       [[[5., 5.],
         [5., 5.]],

        [[6., 6.],
         [6., 6.]],

        [[7., 7.],
         [7., 7.]],

        [[8., 8.],
         [8., 8.]]],


       [[[9., 9.],
         [9., 9.]],

        [[10., 10.],
         [10., 10.]],

        [[11., 11.],
         [11., 11.]],

        [[12., 12.],
         [12., 12.]]],


       [[[13., 13.],
         [13., 13.]],

        [[14., 14.],
         [14., 14.]],

        [[15., 15.],
         [15., 15.]],

        [[16., 16.],
         [16., 16.]]]])
  

Теперь я хочу преобразовать его в единую матрицу, чтобы я мог иметь группы в строках (но только значения, а не в виде матрицы). Я хочу построить матрицы 4×4 рядом друг с другом на одном графике с imshow помощью функции matplotlib, поэтому она должна выглядеть так:

 [[ 1.,  1.,  2.,  2.,  3.,  3.,  4.,  4.],
 [ 1.,  1.,  2.,  2.,  3.,  3.,  4.,  4.],
 [ 5.,  5.,  6.,  6.,  7.,  7.,  8.,  8.],
 [ 5.,  5.,  6.,  6.,  7.,  7.,  8.,  8.],
 [ 9.,  9., 10., 10., 11., 11., 12., 12.],
 [ 9.,  9., 10., 10., 11., 11., 12., 12.],
 [13., 13., 14., 14., 15., 15., 16., 16.],
 [13., 13., 14., 14., 15., 15., 16., 16.]]
  

Возможно ли это вообще? Я хотел бы использовать только функции numpy и избегать циклов for по соображениям производительности, но если это невозможно, другое решение также было бы отличным.

Ответ №1:

Вот что я бы сделал:

 # other sample:
arr=np.arange(64).reshape(4,4,2,2)

arr.swapaxes(2,1).reshape(arr.shape[0] * arr.shape[2],-1)
  

Выходной сигнал:

 array([[ 0,  1,  4,  5,  8,  9, 12, 13],
       [ 2,  3,  6,  7, 10, 11, 14, 15],
       [16, 17, 20, 21, 24, 25, 28, 29],
       [18, 19, 22, 23, 26, 27, 30, 31],
       [32, 33, 36, 37, 40, 41, 44, 45],
       [34, 35, 38, 39, 42, 43, 46, 47],
       [48, 49, 52, 53, 56, 57, 60, 61],
       [50, 51, 54, 55, 58, 59, 62, 63]])