Flattening an array in NumPy means converting a multi-dimensional array into a one-dimensional array.
This is commonly used when reshaping data, especially in machine learning, image processing, and data analysis, where you often need to format data into a single row or column.
In this tutorial, we will cover:
- Basic Flattening with flatten()
- Flattening with ravel()
- Using reshape() to Flatten Arrays
- Difference Between flatten() and ravel()
- Flattening Higher-Dimensional Arrays
Let’s go through each method with examples.
1. Basic Flattening with flatten()
The flatten() method in NumPy converts an array into a one-dimensional array.
It returns a new copy of the array in a flattened form.
Example 1: Flattening a 2D Array
import numpy as np # Create a 2D array array_2d = np.array([[1, 2, 3], [4, 5, 6]]) # Flatten the 2D array flattened_array = array_2d.flatten() print("Flattened Array:\n", flattened_array)
Output:
Flattened Array: [1 2 3 4 5 6]
- Explanation: flatten() creates a new 1D array from the 2D array, copying the data in a row-major (C-style) order by default.
Example 2: Flattening in Column-Major Order
You can specify the order in which to flatten: ‘C' (row-major), ‘F' (column-major), or ‘A' (depends on memory layout).
# Flatten in column-major (Fortran-style) order flattened_array_fortran = array_2d.flatten(order='F') print("\nFlattened Array (Column-Major Order):\n", flattened_array_fortran)
Output:
Flattened Array (Column-Major Order): [1 4 2 5 3 6]
- Explanation: With order='F', the array is flattened by columns, reading elements in a column-first order.
2. Flattening with ravel()
The ravel() function is similar to flatten(), but it returns a flattened view of the array if possible.
This means that ravel() often does not create a new array but instead provides a reference to the original array, making it more memory-efficient.
Example 3: Flattening a 2D Array with ravel()
# Flatten the array with ravel raveled_array = array_2d.ravel() print("Raveled Array:\n", raveled_array)
Output:
Raveled Array: [1 2 3 4 5 6]
- Explanation: ravel() provides a 1D view of array_2d, which is generally more memory-efficient than flatten().
Example 4: Column-Major Order with ravel()
# Flatten with column-major (Fortran-style) order raveled_array_fortran = array_2d.ravel(order='F') print("\nRaveled Array (Column-Major Order):\n", raveled_array_fortran)
Output:
Raveled Array (Column-Major Order): [1 4 2 5 3 6]
- Explanation: Like flatten(), ravel() also allows specifying order='F' to flatten the array by columns.
3. Using reshape() to Flatten Arrays
The reshape() function can also be used to flatten an array by setting its shape to (-1,), where -1 instructs NumPy to infer the dimension.
Example 5: Flattening a 2D Array with reshape()
# Flatten the array using reshape reshaped_array = array_2d.reshape(-1) print("Flattened Array using reshape:\n", reshaped_array)
Output:
Flattened Array using reshape: [1 2 3 4 5 6]
- Explanation: reshape(-1) flattens the array into a 1D array by inferring the length of the dimension.
Example 6: Column-Major Order with reshape()
# Flatten the array using reshape in column-major order reshaped_array_fortran = array_2d.reshape(-1, order='F') print("\nFlattened Array using reshape (Column-Major Order):\n", reshaped_array_fortran)
Output:
Flattened Array using reshape (Column-Major Order): [1 4 2 5 3 6]
- Explanation: reshape(-1, order='F') reshapes the array into a flattened 1D array in column-major order.
4. Difference Between flatten() and ravel()
While flatten() and ravel() may appear similar, there is an important difference between them:
- flatten() always returns a copy of the array, which means modifications to the flattened array do not affect the original array.
- ravel() returns a view of the array when possible, which is more memory-efficient. Modifying the output of ravel() may affect the original array.
Example 7: Modifying a Flattened Array with flatten() and ravel()
# Modify the flattened copy with flatten flattened_copy = array_2d.flatten() flattened_copy[0] = 99 print("Original Array after flatten modification:\n", array_2d) # Modify the raveled view with ravel raveled_view = array_2d.ravel() raveled_view[0] = 99 print("\nOriginal Array after ravel modification:\n", array_2d)
Output:
Original Array after flatten modification: [[ 1 2 3] [ 4 5 6]] Original Array after ravel modification: [[99 2 3] [ 4 5 6]]
- Explanation: Changing flattened_copy (from flatten()) does not affect array_2d, while modifying raveled_view (from ravel()) changes the original array since ravel() returns a view when possible.
5. Flattening Higher-Dimensional Arrays
The same methods (flatten(), ravel(), and reshape()) can be used to flatten arrays of any dimensionality into a 1D array.
Example 8: Flattening a 3D Array
# Create a 3D array array_3d = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) # Flatten the 3D array flattened_3d = array_3d.flatten() print("Flattened 3D Array:\n", flattened_3d)
Output:
Flattened 3D Array: [1 2 3 4 5 6 7 8]
Example 9: Column-Major Order Flattening of a 3D Array
# Flatten the 3D array in column-major order flattened_3d_fortran = array_3d.flatten(order='F') print("\nFlattened 3D Array (Column-Major Order):\n", flattened_3d_fortran)
Output:
Flattened 3D Array (Column-Major Order): [1 5 3 7 2 6 4 8]
- Explanation: Flattening higher-dimensional arrays in column-major order changes the order in which elements are accessed and listed in the flattened array.
Summary of Array Flattening Techniques in NumPy
Function | Description |
---|---|
flatten() | Returns a flattened copy of the array; by default, flattens in row-major order (order='C'). |
ravel() | Returns a flattened view of the array when possible; more memory-efficient than flatten(). |
reshape(-1) | Converts any array into a 1D array by inferring the dimension. |
Order (C vs F) | Specifies the flattening order: row-major (C), column-major (F), or automatic (A). |
Conclusion
In this tutorial, we explored various ways to flatten arrays in NumPy, including:
- Flattening with flatten(), which returns a new flattened array.
- Flattening with ravel(), which returns a flattened view of the original array when possible.
- Flattening with reshape(), which converts an array to 1D with shape (-1,).
- Column-major order flattening to control the order of elements in the flattened array.