Array Manipulation Routines – SolutionsΒΆ

These solutions demonstrate how to reshape, transpose, concatenate, split, tile, repeat, trim, and flip arrays using NumPy’s manipulation functions. Many questions show multiple valid approaches – for example, np.concatenate() with an axis parameter vs. the convenience wrappers np.hstack() and np.vstack(). Understanding these alternatives helps you choose the most readable option for each situation.

import numpy as np
np.__version__

Q1. Let x be a ndarray [10, 10, 3] with all elements set to one. Reshape x so that the size of the second dimension equals 150.

x = np.ones([10, 10, 3])
out = np.reshape(x, [-1, 150])
print out
assert np.allclose(out, np.ones([10, 10, 3]).reshape([-1, 150]))

Q2. Let x be array [[1, 2, 3], [4, 5, 6]]. Convert it to [1 4 2 5 3 6].

x = np.array([[1, 2, 3], [4, 5, 6]])
out1 = np.ravel(x, order='F')
out2 = x.flatten(order="F")
assert np.allclose(out1, out2)
print out1

Q3. Let x be array [[1, 2, 3], [4, 5, 6]]. Get the 5th element.

x = np.array([[1, 2, 3], [4, 5, 6]])
out1 = x.flat[4]
out2 = np.ravel(x)[4]
assert np.allclose(out1, out2)
print out1

Q4. Let x be an arbitrary 3-D array of shape (3, 4, 5). Permute the dimensions of x such that the new shape will be (4,3,5).

x = np.zeros((3, 4, 5))
out1 = np.swapaxes(x, 1, 0)
out2 = x.transpose([1, 0, 2])
assert out1.shape == out2.shape
print out1.shape

Q5. Let x be an arbitrary 2-D array of shape (3, 4). Permute the dimensions of x such that the new shape will be (4,3).

x = np.zeros((3, 4))
out1 = np.swapaxes(x, 1, 0)
out2 = x.transpose()
out3 = x.T
assert out1.shape == out2.shape == out3.shape
print out1.shape

Q5. Let x be an arbitrary 2-D array of shape (3, 4). Insert a nex axis such that the new shape will be (3, 1, 4).

x = np.zeros((3, 4))
print np.expand_dims(x, axis=1).shape

Q6. Let x be an arbitrary 3-D array of shape (3, 4, 1). Remove a single-dimensional entries such that the new shape will be (3, 4).

x = np.zeros((3, 4, 1))
print np.squeeze(x).shape

Q7. Lex x be an array
[[ 1 2 3]
[ 4 5 6].

and y be an array
[[ 7 8 9]
[10 11 12]].
Concatenate x and y so that a new array looks like
[[1, 2, 3, 7, 8, 9],
[4, 5, 6, 10, 11, 12]].

x = np.array([[1, 2, 3], [4, 5, 6]])
y = np.array([[7, 8, 9], [10, 11, 12]])
out1 = np.concatenate((x, y), 1)
out2 = np.hstack((x, y))
assert np.allclose(out1, out2)
print out2

Q8. Lex x be an array
[[ 1 2 3]
[ 4 5 6].

and y be an array
[[ 7 8 9]
[10 11 12]].
Concatenate x and y so that a new array looks like
[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]]

x = np.array([[1, 2, 3], [4, 5, 6]])
y = np.array([[7, 8, 9], [10, 11, 12]])
out1 = np.concatenate((x, y), 0)
out2 = np.vstack((x, y))
assert np.allclose(out1, out2)
print out2

Q8. Let x be an array [1 2 3] and y be [4 5 6]. Convert it to [[1, 4], [2, 5], [3, 6]].

x = np.array((1,2,3))
y = np.array((4,5,6))
out1 = np.column_stack((x, y))
out2 = np.squeeze(np.dstack((x, y)))
out3 = np.vstack((x, y)).T
assert np.allclose(out1, out2)
assert np.allclose(out2, out3)
print out1

Q9. Let x be an array [[1],[2],[3]] and y be [[4], [5], [6]]. Convert x to [[[1, 4]], [[2, 5]], [[3, 6]]].

x = np.array([[1],[2],[3]])
y = np.array([[4],[5],[6]])
out = np.dstack((x, y))
print out

Q10. Let x be an array [1, 2, 3, …, 9]. Split x into 3 arrays, each of which has 4, 2, and 3 elements in the original order.

x = np.arange(1, 10)
print np.split(x, [4, 6])

Q11. Let x be an array
[[[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.]],

[[ 8., 9., 10., 11.],
[ 12., 13., 14., 15.]]].
Split it into two such that the first array looks like
[[[ 0., 1., 2.],
[ 4., 5., 6.]],

[[ 8., 9., 10.],
[ 12., 13., 14.]]].

and the second one look like:

[[[ 3.],
[ 7.]],

[[ 11.],
[ 15.]]].

x = np.arange(16).reshape(2, 2, 4)
out1 = np.split(x, [3],axis=2)
out2 = np.dsplit(x, [3])
assert np.allclose(out1[0], out2[0])
assert np.allclose(out1[1], out2[1])
print out1

Q12. Let x be an array
[[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.],
[ 12., 13., 14., 15.]].
Split it into two arrays along the second axis.

x = np.arange(16).reshape((4, 4))
out1 = np.hsplit(x, 2)
out2 = np.split(x, 2, 1)
assert np.allclose(out1[0], out2[0])
assert np.allclose(out1[1], out2[1])
print out1

Q13. Let x be an array
[[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.],
[ 12., 13., 14., 15.]].
Split it into two arrays along the first axis.

x = np.arange(16).reshape((4, 4))
out1 = np.vsplit(x, 2)
out2 = np.split(x, 2, 0)
assert np.allclose(out1[0], out2[0])
assert np.allclose(out1[1], out2[1])
print out1

Q14. Let x be an array [0, 1, 2]. Convert it to
[[0, 1, 2, 0, 1, 2],
[0, 1, 2, 0, 1, 2]].

x = np.array([0, 1, 2])
out1 = np.tile(x, [2, 2])
out2 = np.resize(x, [2, 6])
assert np.allclose(out1, out2)
print out1

Q15. Let x be an array [0, 1, 2]. Convert it to
[0, 0, 1, 1, 2, 2].

x = np.array([0, 1, 2])
print np.repeat(x, 2)

Q16. Let x be an array [0, 0, 0, 1, 2, 3, 0, 2, 1, 0].
remove the leading the trailing zeros.

x = np.array((0, 0, 0, 1, 2, 3, 0, 2, 1, 0))
out = np.trim_zeros(x)
print out

Q17. Let x be an array [2, 2, 1, 5, 4, 5, 1, 2, 3]. Get two arrays of unique elements and their counts.

x = np.array([2, 2, 1, 5, 4, 5, 1, 2, 3])
u, indices = np.unique(x, return_counts=True)
print u, indices

Q18. Lex x be an array
[[ 1 2]
[ 3 4].
Flip x along the second axis.

x = np.array([[1,2], [3,4]])
out1 = np.fliplr(x)
out2 = x[:, ::-1]
assert np.allclose(out1, out2)
print out1

Q19. Lex x be an array
[[ 1 2]
[ 3 4].
Flip x along the first axis.

x = np.array([[1,2], [3,4]])
out1 = np.flipud(x)
out2 = x[::-1, :]
assert np.allclose(out1, out2)
print out1

Q20. Lex x be an array
[[ 1 2]
[ 3 4].
Rotate x 90 degrees counter-clockwise.

x = np.array([[1,2], [3,4]])
out = np.rot90(x)
print out

Q21 Lex x be an array
[[ 1 2 3 4]
[ 5 6 7 8].
Shift elements one step to right along the second axis.

x = np.arange(1, 9).reshape([2, 4])
print np.roll(x, 1, axis=1)