2016-02-18 5 views
1

У меня есть очень большой массив с формой = (32, 3, 1E6) мне нужно, чтобы изменить его в этой форме = (3, 32e6)Reshape NumPy 3D массив 2D

На фрагменте, как чтобы перейти от этого ::

>>> m3_3_5 
array([[[8, 4, 1, 0, 0], 
     [6, 8, 5, 5, 2], 
     [1, 1, 1, 1, 1]], 

     [[8, 7, 1, 0, 3], 
     [2, 8, 5, 5, 2], 
     [1, 1, 1, 1, 1]], 

     [[2, 4, 0, 2, 3], 
     [2, 5, 5, 3, 2], 
     [1, 1, 1, 1, 1]]]) 

к этому ::

>>> res3_15 
array([[8, 4, 1, 0, 0, 8, 7, 1, 0, 3, 2, 4, 0, 2, 3], 
     [6, 8, 5, 5, 2, 2, 8, 5, 5, 2, 2, 5, 5, 3, 2], 
     [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]) 

я попробовать различные комбинации с RESHAPE без успеха ::

>>> dd.T.reshape(3, 15) 
array([[8, 8, 2, 6, 2, 2, 1, 1, 1, 4, 7, 4, 8, 8, 5], 
     [1, 1, 1, 1, 1, 0, 5, 5, 5, 1, 1, 1, 0, 0, 2], 
     [5, 5, 3, 1, 1, 1, 0, 3, 3, 2, 2, 2, 1, 1, 1]]) 

>>> dd.reshape(15, 3).T.reshape(3, 15) 
array([[8, 0, 8, 2, 1, 8, 0, 8, 2, 1, 2, 2, 5, 2, 1], 
     [4, 0, 5, 1, 1, 7, 3, 5, 1, 1, 4, 3, 5, 1, 1], 
     [1, 6, 5, 1, 1, 1, 2, 5, 1, 1, 0, 2, 3, 1, 1]]) 
+2

Возможно, вам потребуется «транспонировать» в дополнение к 'reshape'. Я уверен, что вы получите ответы, но вы, вероятно, узнаете больше, экспериментируя самостоятельно. – hpaulj

+1

Действительно. И для чего это стоит, я просто нашел подходящую транспозицию, попробовав несколько вещей, пока не сработал. :-) – DSM

+0

Попробуйте 'transpose' с аргументом, что-то вроде' transpose ([2,0,1]) '(просто догадка). – hpaulj

ответ

2

a.transpose([1,0,2]).reshape(3,15) будет делать то, что вы хотите. (Я в основном следую комментариям @hpaulj).

In [14]: a = np.array([[[8, 4, 1, 0, 0], 
     [6, 8, 5, 5, 2], 
     [1, 1, 1, 1, 1]], 

     [[8, 7, 1, 0, 3], 
     [2, 8, 5, 5, 2], 
     [1, 1, 1, 1, 1]], 

     [[2, 4, 0, 2, 3], 
     [2, 5, 5, 3, 2], 
     [1, 1, 1, 1, 1]]]) 

In [15]: a.transpose([1,0,2]).reshape(3,15) 
Out[15]: 
array([[8, 4, 1, 0, 0, 8, 7, 1, 0, 3, 2, 4, 0, 2, 3], 
     [6, 8, 5, 5, 2, 2, 8, 5, 5, 2, 2, 5, 5, 3, 2], 
     [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]) 
+0

ОК теперь ясно, мне не хватало аргумент транспонирования * осей для массива nD n> 2 – user3313834

2

Вы можете получить желаемое поведение с np.hstack

# g is your (3,3,5) array from above 
reshaped = np.hstack(g[i,:,:] for i in range(3)) #uses a generator exp 
reshaped_simpler = np.hstack(g) # this produces equivalent output to the above statmement 
print reshaped # (3,30) 

Выходной

array([[8, 4, 1, 0, 0, 8, 7, 1, 0, 3, 2, 4, 0, 2, 3], 
     [6, 8, 5, 5, 2, 2, 8, 5, 5, 2, 2, 5, 5, 3, 2], 
     [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]) 
+0

Получает ли порядок элементов правильно? – hpaulj

+0

Да, тривиальный файл m3_3_5.reshape (3, 15) не дает ожидаемого результата. – user3313834

+1

Вы можете упростить это до 'np.hstack (g)' или 'np.concatenate (g, axis = -1)'. Он выполняет итерацию ввода, эффективно разбивая его на 1-ю ось, а затем снова собирает на последней оси. Это переупорядочивает значения по желанию (в данном случае). – hpaulj

Смежные вопросы