Изменить 3D массив в 2D массив Python - PullRequest
0 голосов
/ 08 февраля 2019

Если у меня есть трехмерный массив ([4,3,3]), подобный этому:

[[0,1,2]   [[9,10,11 ]    [[18,19,20]   [[27,28,29] 
 [3,4,5]    [12,13,14]     [21,22,23]    [30,31,32]
 [6,7,8]] , [15,16,17]] ,  [24,25,26]] , [33,34,35]]

Как бы преобразовать его в двумерный массив ([6,6]), как этоттак что 1-я половина массивов находится в верхней половине 160x160, а 2-я половина - в нижней:

[[0,1,2,9,10,11]
[3,4,5,12,13,14]
[6,7,8,15,16,17]
[18,19,20,27,28,29] 
[21,22,23,30,31,32]
[24,25,26,33,34,35]]

Создание моего массива:

qDCTReversed = np.zeros((400,8,8), dtype=np.int)

И мне нужно(160 160) массив.

Ответы [ 3 ]

0 голосов
/ 08 февраля 2019

Вы можете изменить форму, которую вы просите:

x = np.arange(36).reshape((4,3,3))
np.vstack(np.hstack(x[2*i:2+2*i]) for i in range(x.shape[0]//2))
>>array([[ 0,  1,  2,  9, 10, 11],
   [ 3,  4,  5, 12, 13, 14],
   [ 6,  7,  8, 15, 16, 17],
   [18, 19, 20, 27, 28, 29],
   [21, 22, 23, 30, 31, 32],
   [24, 25, 26, 33, 34, 35]])
0 голосов
/ 08 февраля 2019

Очень быстрое однострочное решение без использования for -циклов:

# initialization
qDCTReversed = np.arange(4*3*3).reshape((4,3,3)) 

# calculation
qDCTReversed = qDCTReversed.reshape((2,2,3,3)).transpose((0,2,1,3)).reshape((6,6))

или для массива (400,8,8):

qDCTReversed.reshape((20,20,8,8)).transpose((0,2,1,3)).reshape((160,160))

Сравнение скорости:

Ответ Мстено : 0,393 мс

ответ Яту : 0,138 мс

Этот ответ: 0,016 мс

0 голосов
/ 08 февраля 2019

Вы можете сделать это, выполнив цикл по списку следующим образом:

a = [[[ 0, 1, 2], [ 9,10,11]],
     [[ 3, 4, 5], [12,13,14]],
     [[ 6, 7, 8], [15,16,17]],
     [[18,19,20], [27,28,29]],
     [[21,22,23], [30,31,32]],
     [[24,25,26], [33,34,35]]]

b = [[i for j in k for i in j ] for k in a]
print(b)

вывод:

[ 0,  1,  2,  9, 10, 11]
[ 3,  4,  5, 12, 13, 14]
[ 6,  7,  8, 15, 16, 17]
[18, 19, 20, 27, 28, 29]
[21, 22, 23, 30, 31, 32]
[24, 25, 26, 33, 34, 35]
...