2016-04-11 2 views
0

У меня есть [? 5 5] массив: (? = 3 в этом случае)Массивная масса [? 5 5] до пяти массивов с [? 5]

[[[ 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 36 37 38 39] 
[40 41 42 43 44] 
[45 46 47 48 49]] 
[[50 51 52 53 54] 
[55 56 57 58 59] 
[60 61 62 63 64] 
[65 66 67 68 69] 
[70 71 72 73 74]]] 

Я хочу иметь 5 (в # в строке) отдельный массив имеет, как это (5?):

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

Это простой, предпочтительно один/два режима работы numpy для этого?

+0

Я бы предложил переименовать вопрос в 'Numpy array [3 5 5] to [5 3 5]' или '... to 5x [3 5]', чтобы сделать его более полезным для других. По-видимому, слово «транспонирование» не очевидно для всех, кто смотрит на многомерные данные в первый раз, поэтому именно здесь стоит сохранить этот вопрос. В противном случае я уверен, что это будет дублировать другие существующие вопросы «транспонирования». – roadrunner66

+0

@ roadrunner66 Я использую?, Потому что это может быть что угодно. Как вы думаете, изменить его на 5 лучше для других? Благодаря! –

+0

Да, я не уверен, я просто хотел найти, что другие с подобной проблемой (кто не знает слово транспозиция) найдут ваш вопрос. Может быть, «переупорядочить размеры массива numpy»? – roadrunner66

ответ

2

Да, есть: numpy.transpose. Вы можете выбрать любую последовательность в осях вашей трехмерной структуры.

import numpy as np 

aaa=np.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, 36, 37, 38, 39], 
[40, 41, 42, 43, 44], 
[45, 46, 47, 48, 49]], 
[[50, 51, 52, 53, 54], 
[55, 56, 57, 58, 59], 
[60, 61, 62, 63, 64], 
[65, 66, 67, 68, 69], 
[70, 71, 72, 73, 74]]]) 

bb= np.transpose(aaa,axes=[1,0,2]) 
print bb 

выход:

[[[ 0 1 2 3 4] 
    [25 26 27 28 29] 
    [50 51 52 53 54]] 

[[ 5 6 7 8 9] 
    [30 31 32 33 34] 
    [55 56 57 58 59]] 

[[10 11 12 13 14] 
    [35 36 37 38 39] 
    [60 61 62 63 64]] 

[[15 16 17 18 19] 
    [40 41 42 43 44] 
    [65 66 67 68 69]] 

[[20 21 22 23 24] 
    [45 46 47 48 49] 
    [70 71 72 73 74]]]. 

Чтобы получить доступ к подмассива, просто использовать индексацию как так:

c= b[0] 
print c 

Выход:

[[ 0 1 2 3 4] 
[25 26 27 28 29] 
[50 51 52 53 54]] 
+0

Спасибо! Затем, следует ли применить split для получения пяти массивов? Могу ли я сделать это за одну операцию? –

+0

Не требуется раскол. Чтобы получить доступ к пяти подмассивам, просто используйте индексирование: 'print b [0]' 'print b [1]' и т. Д. Или переназначьте все, что вам нравится: 'c1 = b [0]' и т. Д. – roadrunner66

+1

@SungKim Кроме того, вы можете просто напишите 'a, b, c, d, e = np.transpose (aaa, axes = (1, 0, 2))'. –

2

Просто предложить альтернативное решение, np.swapaxes является еще одним rnative до np.transpose, когда задействована только пара осей.

a, b, c, d, e = arr.swapaxes(0, 1) # swap axes 0, 1 

swapaxes всегда возвращает вид массива, с тем же результатом, что и np.transpose предложенный @ roadrunner66. Обычно это просто зрелищно быстрее, чем transpose, и сильно используется внутри кода numpy, чтобы поставить важное значение размер спереди.

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