Numpy Arrays - Convert A 3D Array To A 2D Array
Having the following 3D array (9,9,9): np.arange(729).reshape((9,9,9)) [[[ 0 1 2 3 4 5 6 7 8] [ 9 10 11 12 13 14 15 16 17] [ 18 19 20 21 22 23 2
Solution 1:
You can firstly reshape the array to a 4d array, swap the second and third axises and then reshape it to 27 X 27:
a.reshape(3,3,9,9).transpose((0,2,1,3)).reshape(27,27)
#array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 81, 82, 83, 84,
# 85, 86, 87, 88, 89, 162, 163, 164, 165, 166, 167, 168, 169,
# 170],
# [ 9, 10, 11, 12, 13, 14, 15, 16, 17, 90, 91, 92, 93,
# 94, 95, 96, 97, 98, 171, 172, 173, 174, 175, 176, 177, 178,
# 179],
# ...
# [558, 559, 560, 561, 562, 563, 564, 565, 566, 639, 640, 641, 642,
# 643, 644, 645, 646, 647, 720, 721, 722, 723, 724, 725, 726, 727,
# 728]])
Solution 2:
import numpy as np
x = np.arange(729).reshape(9, 9, 9)
y = x.transpose(1, 0, 2).reshape(27, 27)
y[y[:,2].argsort()]
Explanations
I used numpy.transpose
to permute the stride and shape information for each axis.
>>> x.strides
(324L, 36L, 4L)
>>> x.transpose(1, 0, 2).strides
(36L, 324L, 4L)
more info in this answer.
Then I used numpy.reshape
the 3D (9L, 9L, 9L)
in 2D as expected
>>> x.reshape(27, 27)
(27L, 27L)
Of course, the combination of functions (like transpose
and reshape
) is very common in numpy
. It allows you do to this matrix transformation in a one-liner:
x.transpose(1, 0, 2).reshape(27, 27)
EDIT
As @PaulPanzer point it out, the array was unsorted.
To sort array column by column, one can use:
y[y[:,2].argsort()]
But maybe it isn't the easiest answer anymore.
Solution 3:
If you are ok with moving data in a list you can use:
np.hstack([x for x in np.arange(729).reshape((9,9,9))])
Post a Comment for "Numpy Arrays - Convert A 3D Array To A 2D Array"