This seems quite difficult for me. I have tried multiple solution but it didn't worked
my original array is in this form:
arr = np.array([
[
[1, 3, 9, 1],
[2, 2, 9, 1],
[1, 1, 6, 4],
],
[
[3, 3, 3, 4],
[0, 9, 2, 6],
[7, 6, 6, 1],
]
])
Where as my expected output is:
arr = np.array(
[
[
[
[1],
[2],
[1],
],
[
[3],
[2],
[1],
],
[
[9],
[9],
[6],
],
[
[1],
[1],
[4],
],
],
[
[
[3],
[0],
[7],
],
[
[3],
[9],
[6],
],
[
[3],
[2],
[6],
],
[
[4],
[6],
[1],
],
],
]
)
How can I achieve above output, i have tried np.reshape(arr, (len(arr[0][0]), len(arr[0]), 1))
and many more but failed to obtain my expected output. Please suggest changes.
CodePudding user response:
Transpose and then expand the axis:
>>> arr.transpose(0, 2, 1)[..., None]
array([[[[1],
[2],
[1]],
[[3],
[2],
[1]],
[[9],
[9],
[6]],
[[1],
[1],
[4]]],
[[[3],
[0],
[7]],
[[3],
[9],
[6]],
[[3],
[2],
[6]],
[[4],
[6],
[1]]]])
The shape of the original array is (2, 3, 4)
, and the shape of the expected array is (2, 4, 3, 1)
, arr.transpose(0, 2, 1)
will swap the lengths of the last two axes (because the positions of the last two numbers of (0, 1, 2)
are exchanged here):
>>> arr.transpose(0, 2, 1).shape
(2, 4, 3)
A more intuitive example might be using swapaxes
:
>>> arr.swapaxes(1, 2).shape
(2, 4, 3)
Slicing is used to expand the axis, where [..., None]
is equivalent to [:, :, :, None]
(the number of :
depends on your array dimension), which will expand the shape of the array from (a, b, c)
to (a, b, c, 1)
.