Разделить последнюю ось, затем переставить оси -
In [41]: a
Out[41]:
array([[[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12],
[13, 14, 15, 16]]])
In [42]: a.reshape(-1,2,2).swapaxes(1,2)
Out[42]:
array([[[ 1, 3],
[ 2, 4]],
[[ 5, 7],
[ 6, 8]],
[[ 9, 11],
[10, 12]],
[[13, 15],
[14, 16]]])
Если вам нужна конечная выходная форма, равная (1,4,2,2)
, добавьте новую ось спереди с помощью None/np.newaxis
-
In [43]: a.reshape(-1,2,2).swapaxes(1,2)[None]
Out[43]:
array([[[[ 1, 3],
[ 2, 4]],
[[ 5, 7],
[ 6, 8]],
[[ 9, 11],
[10, 12]],
[[13, 15],
[14, 16]]]])
In [44]: _.shape
Out[44]: (1, 4, 2, 2)
Для общего случая с известным количеством элементов в списке, скажем, n
, это будет -
a.reshape(-1,n,a.shape[-1]//n).swapaxes(1,2)[None]
More info on
nd-массивы transformation.