# NumPy Python Library Cheatsheet

NumPy, short for Numerical Python, is a powerful library in the Python ecosystem that provides support for large, multi-dimensional arrays and matrices, along with a collection of mathematical functions to operate on these elements. Whether you’re a data scientist, machine learning engineer, or a scientific researcher, mastering NumPy is essential for efficient numerical computations. In this cheatsheet, we’ll cover the fundamental operations and features that will empower you to wield NumPy with confidence.

## Installation

Before diving into NumPy, ensure that you have it installed. You can install it using:

``pip install numpy``

## Importing NumPy

``import numpy as np``

## Creating Arrays

### 1D Array

``array_1d = np.array([1, 2, 3, 4, 5])``

### 2D Array

``array_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])``

### Common Initialization

``````zeros_array = np.zeros((3, 3))  # 3x3 array of zeros
ones_array = np.ones((2, 4))    # 2x4 array of ones
identity_matrix = np.eye(3)     # 3x3 identity matrix``````

## Array Operations

### Array Shape and Size

``````shape = array_2d.shape      # Shape of the array
size = array_2d.size        # Total number of elements in the array``````

### Reshape Array

``reshaped_array = array_1d.reshape(5, 1)``

### Transpose Array

``transposed_array = array_2d.T``

### Indexing and Slicing

``````element = array_1d[2]           # Accessing a single element
subset = array_2d[1:3, 0:2]      # Slicing a 2D array``````

### Element-wise Operations

``````sum_result = array_1d + 2       # Add 2 to each element
product_result = array_2d * 3    # Multiply each element by 3``````

### Universal Functions

``````sqrt_result = np.sqrt(array_1d)  # Square root of each element
exp_result = np.exp(array_1d)    # Exponential of each element``````

## Mathematical Operations

### Basic Statistics

``````mean_value = np.mean(array_2d)
median_value = np.median(array_2d)
std_deviation = np.std(array_2d)``````

### Linear Algebra

``````dot_product = np.dot(array_2d, array_2d.T)  # Dot product of two arrays
matrix_inverse = np.linalg.inv(array_2d)    # Inverse of a matrix``````

### Random Number Generation

``random_array = np.random.rand(3, 3)        # 3x3 array of random values between 0 and 1``

NumPy allows operations between arrays of different shapes and sizes, making your code concise and efficient.

``broadcasted_result = array_2d + np.array([10, 20, 30])``

``````np.save('saved_array.npy', array_2d)          # Save array to a file

This NumPy cheatsheet covers the basics, but the library is vast and offers many more features and functions. Regular practice and exploration of the official NumPy documentation will deepen your understanding and proficiency. Armed with this cheatsheet, you are well-equipped to handle a wide range of numerical computations efficiently.

## FAQ

### 1. Why should I use NumPy instead of Python lists for numerical operations?

NumPy provides a more efficient and convenient way to perform numerical operations compared to Python lists. NumPy arrays are homogeneous and allow for vectorized operations, which are significantly faster than using loops with standard Python lists. Additionally, NumPy has a wealth of functions for linear algebra, random number generation, and other mathematical operations, making it a go-to library for numerical computing tasks.

### 2. How do I check the version of NumPy installed on my system?

You can check the version of NumPy installed by using the following command in Python:
`import numpy as np print(np.__version__)`
This will print the version number of the installed NumPy library.

### 3. Can I perform element-wise operations on arrays of different shapes in NumPy?

Yes, NumPy supports broadcasting, allowing you to perform element-wise operations on arrays of different shapes and sizes. Broadcasting automatically adjusts the shape of smaller arrays to match the shape of larger arrays, making it easier to write concise and efficient code.

### 4. How can I speed up my NumPy code?

To optimize NumPy code, consider the following tips:
Use vectorized operations instead of loops to take advantage of NumPy’s optimized C and Fortran code.
Avoid unnecessary copying of arrays. NumPy is designed to work with views of data rather than creating unnecessary copies.
Use NumPy’s built-in functions and ufuncs (universal functions) instead of custom functions for common operations.

### 5. What is the difference between `np.array` and `np.ndarray` in NumPy?

In practice, there is no significant difference between `np.array` and `np.ndarray`. Both are used to create arrays in NumPy. The `np.array` function is a convenience function that infers the data type from the input, while `np.ndarray` is the class of array objects. You can use either depending on your preference, but `np.array` is more commonly used for simplicity and readability.