# # 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])
``````