# The Shape of NumPy Arrays

A shape is a tuple of integer numbers, each of which is the number of elements in each dimension.

The data buffer is always 1 dimensional, considering it's a plain C-style array. Numpy provides a view on top of the data buffer, to see it as a multi-dimensional object.

  • For 1D array, the shape tuple has only 1 value: (i, ). Number i happens to be the array index.
  • For 2D array, the shape tuple has only 2 value: (i, j, ). Number i is the row number, and number j is the column number.
  • For 3D array, the shape tuple has only 3 value: (i, j, k, ).
  • And so on.

To get the shape of a NumPy array, we use the property of .shape.

>>> x = np.array([1,2,3,4,5,6,7,8,9])
>>> x.shape # One dimensional array, having 9 elements.
(9,)

Reshaping the array is through the .reshape() method. It creates a new array with a changed shape, but shares the underlying data buffer with the original array.

>>> y = x.reshape((3,3))
>>> y.shape
(3,3)

When reshaping, one and exact one of the number in the shape tuple can be -1. NumPy can infer the unspecified value -1. So, if you see the code of .reshape((..., -1, ...)), don't be fooled; it actually asks NumPy to calculate the unknown shape value.

>>> z = x.reshape((3,-1))
>>> z.shape
(3,3)

>>> x.reshape((-1,-1)) # Duhhh, it won't work!
ValueError: can only specify one unknown dimension

Method .reshape() can also be used to flatten the array to 1D array.

>>> z.reshape(-1)
array([1, 2, 3, 4, 5, 6, 7, 8, 9])