NumPy, short for Numerical Python, is a foundational library for numerical computing in Python. Its core strength lies in its powerful ndarray object, short for "n-dimensional array." NumPy arrays provide a highly efficient way to store and manipulate numerical data, significantly enhancing the speed and performance of numerical computations compared to Python lists.
What is a NumPy Array?
A NumPy array is a multidimensional array that can store elements of the same data type. This homogeneity, along with its contiguous memory allocation, allows NumPy to perform operations on entire arrays much faster than Python's built-in lists, which are dynamic and can store elements of varying data types.
Creating NumPy Arrays
You can create NumPy arrays in several ways:
From a Python List
import numpy as np
# Create a 1D array
arr1 = np.array([1, 2, 3, 4, 5])
print(arr1) # Output: [1 2 3 4 5]
# Create a 2D array
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print(arr2) # Output: [[1 2 3]
# [4 5 6]]
Using Built-in Functions
NumPy provides several functions for generating arrays with specific patterns:
- np.zeros(shape): Creates an array filled with zeros.
- np.ones(shape): Creates an array filled with ones.
- np.arange(start, stop, step): Creates an array with evenly spaced values.
- np.linspace(start, stop, num): Creates an array with evenly spaced values within a specified range.
- np.eye(n): Creates an identity matrix of size n x n.
- np.random.rand(shape): Creates an array with random values between 0 and 1.
- np.random.randint(low, high, size): Creates an array with random integers within a specified range.
# Create an array of zeros
zeros_arr = np.zeros((3, 4))
print(zeros_arr)
# Output: [[0. 0. 0. 0.]
# [0. 0. 0. 0.]
# [0. 0. 0. 0.]]
# Create an array with evenly spaced values
arange_arr = np.arange(0, 10, 2)
print(arange_arr) # Output: [0 2 4 6 8]
# Create an array with random integers
random_arr = np.random.randint(1, 10, size=(2, 3))
print(random_arr) # Output: [[4 6 5]
# [7 4 8]]
Accessing Array Elements
You can access elements within a NumPy array using indexing and slicing:
Indexing
# Accessing a single element
arr = np.array([10, 20, 30, 40, 50])
print(arr[2]) # Output: 30
# Accessing elements of a 2D array
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print(arr2[1, 2]) # Output: 6
Slicing
Slicing allows you to select a subset of elements from an array:
arr = np.array([10, 20, 30, 40, 50])
# Slice from index 1 to 4 (exclusive)
print(arr[1:4]) # Output: [20 30 40]
# Slice from the beginning to index 3 (exclusive)
print(arr[:3]) # Output: [10 20 30]
# Slice from index 2 to the end
print(arr[2:]) # Output: [30 40 50]
Array Attributes
NumPy arrays have several useful attributes:
- ndim: Number of dimensions.
- shape: Dimensions of the array.
- size: Total number of elements.
- dtype: Data type of the elements.
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr.ndim) # Output: 2
print(arr.shape) # Output: (2, 3)
print(arr.size) # Output: 6
print(arr.dtype) # Output: int64
Reshaping Arrays
You can reshape an array using the reshape() method:
arr = np.arange(12)
print(arr) # Output: [ 0 1 2 3 4 5 6 7 8 9 10 11]
reshaped_arr = arr.reshape((3, 4))
print(reshaped_arr)
# Output: [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
Array Operations
One of the most significant advantages of NumPy arrays is their ability to perform operations on entire arrays element-wise:
Arithmetic Operations
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
print(arr1 + arr2) # Output: [5 7 9]
print(arr1 - arr2) # Output: [-3 -3 -3]
print(arr1 * arr2) # Output: [ 4 10 18]
print(arr1 / arr2) # Output: [0.25 0.4 0.5 ]
Universal Functions
NumPy provides a wide range of universal functions (ufuncs) that operate on arrays:
arr = np.array([1, 2, 3, 4, 5])
print(np.sqrt(arr)) # Output: [1. 1.41421356 1.73205081 2. 2.23606798]
print(np.exp(arr)) # Output: [ 2.71828183 7.3890561 20.08553692 54.59815003 148.4131591 ]
print(np.sin(arr)) # Output: [ 0.84147098 0.90929743 -0.14112001 -0.75680249 -0.95892427]
Broadcasting
Broadcasting is a powerful feature in NumPy that allows operations between arrays of different shapes under specific conditions. It automatically expands the smaller array to match the dimensions of the larger array.
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5])
print(arr1 + arr2)
# Output: [5 7 8]
# Broadcasting expands arr2 to [4 5 4], then adds element-wise.
Conclusion
NumPy arrays provide a cornerstone for numerical computations in Python. Their efficiency, versatility, and comprehensive capabilities make them a crucial tool for data scientists, engineers, and anyone working with numerical data. Mastering NumPy arrays is essential for leveraging Python's power for scientific computing and data analysis.