From 9ba090a965124cd2bd65e8efe272a69e07694fbe Mon Sep 17 00:00:00 2001 From: Ekram Asif Date: Thu, 27 Jan 2022 21:52:03 +0600 Subject: [PATCH] Create NumPy.md --- tools/NumPy.md | 379 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 379 insertions(+) create mode 100644 tools/NumPy.md diff --git a/tools/NumPy.md b/tools/NumPy.md new file mode 100644 index 0000000..66a58f2 --- /dev/null +++ b/tools/NumPy.md @@ -0,0 +1,379 @@ +# NumPy Cheat Sheet + +[NumPy](http://www.numpy.org) is the fundamental package for scientific computing with Python. + +### Installation +If you don't already have it **installed**, you can do so using Pip or Anaconda: +``` +$ pip install numpy +``` +or +``` +$ conda install numpy +``` + +This cheat sheet acts as a intro to Python for data science. + +## Index +1. [Basics](#basics) + - [Placeholders](#place) + - [Examples](#ex) +2. [Arrays](#arrays) + - [Properties](#props) + - [Copying/Sorting](#gops) + * [Examples](#array-example) + - [Array Manipulation](#man) + * [Adding/Removing Elements](#addrem) + + [Examples](#array-elements-examples) + * [Combining Arrays](#comb) + + [Examples](#array-combine-examples) + * [Splitting Arrays](#split) + + [Examples](#array-split-examples) + * [Shaping](#shape) + * [Misc](#misc) +3. [Mathematics](#maths) + - [Arithmetic Operations](#ops) + * [Examples](#operations-examples) + - [Comparison](#comparison) + * [Examples](#comparison-example) + - [Basic Statistics](#stats) + * [Examples](#stats-examples) + - [More](#more) +4. [Slicing and Subsetting](#ss) + - [Examples](#exp) +5. [Tricks](#tricks) +6. [Credits](#creds) + +
+ +## Basics + +One of the most commonly used functions of NumPy are *NumPy arrays*: The essential difference between *lists* and *NumPy arrays* is functionality and speed. *lists* give you basic operation, but *NumPy* adds FFTs, convolutions, fast searching, basic statistics, linear algebra, histograms, etc.
+The most important difference for data science is the ability to do **element-wise calculations** with *NumPy arrays*. + +`axis 0` always refers to row
+`axis 1` always refers to column + +| Operator | Description | Documentation | +| :------------- | :------------- | :--------| +|`np.array([1,2,3])`|1d array|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.array.html#numpy.array)| +|`np.array([(1,2,3),(4,5,6)])`|2d array|see above| +|`np.arange(start,stop,step)`|range array|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.arange.html)| + +### Placeholders +| Operators | Description |Documentation| +| :------------- | :------------- |:---------- | +|`np.linspace(0,2,9)`|Add evenly spaced values btw interval to array of length |[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.linspace.html)| +|`np.zeros((1,2))`|Create and array filled with zeros|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.zeros.html)| +|`np.ones((1,2))`|Creates an array filled with ones|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.ones.html#numpy.ones)| +|`np.random.random((5,5))`|Creates random array|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.random.random.html)| +|`np.empty((2,2))`|Creates an empty array|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.empty.html)| + +### Examples + +```python +import numpy as np + +# 1 dimensional +x = np.array([1,2,3]) +# 2 dimensional +y = np.array([(1,2,3),(4,5,6)]) + +x = np.arange(3) +>>> array([0, 1, 2]) + +y = np.arange(3.0) +>>> array([ 0., 1., 2.]) + +x = np.arange(3,7) +>>> array([3, 4, 5, 6]) + +y = np.arange(3,7,2) +>>> array([3, 5]) +``` + +
+ +## Array +### Array Properties +|Syntax|Description|Documentation| +|:-------------|:-------------|:-----------| +|`array.shape`|Dimensions (Rows,Columns)|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.shape.html)| +|`len(array)`|Length of Array|[link](https://docs.python.org/3.5/library/functions.html#len)| +|`array.ndim`|Number of Array Dimensions|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.ndim.html)| +|`array.size`|Number of Array Elements|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.size.html)| +|`array.dtype`|Data Type|[link](https://docs.scipy.org/doc/numpy/reference/arrays.dtypes.html)| +|`array.astype(type)`|Converts to Data Type|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.astype.html)| +|`type(array)`|Type of Array|[link](https://docs.scipy.org/doc/numpy/user/basics.types.html)| + +### Copying/Sorting +| Operators | Descriptions | Documentation | +| :------------- | :------------- | :----------- | +|`np.copy(array)`|Creates copy of array|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.copy.html)| +|`other = array.copy()`|Creates deep copy of array|see above| +|`array.sort()`|Sorts an array|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.sort.html)| +|`array.sort(axis=0)`|Sorts axis of array|see above| + +#### Examples +```python +import numpy as np +# Sort sorts in ascending order +y = np.array([10, 9, 8, 7, 6, 5, 4, 3, 2, 1]) +y.sort() +print(y) +>>> [ 1 2 3 4 5 6 7 8 9 10] +``` + +## Array Manipulation Routines + +### Adding or Removing Elements +|Operator|Description|Documentation| +|:-----------|:--------|:---------| +|`np.append(a,b)`|Append items to array|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.append.html)| +|`np.insert(array, 1, 2, axis)`|Insert items into array at axis 0 or 1|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.insert.html)| +|`np.resize((2,4))`|Resize array to shape(2,4)|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.resize.html)| +|`np.delete(array,1,axis)`|Deletes items from array|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.delete.html)| + +#### Example +```python +import numpy as np +# Append items to array +a = np.array([(1, 2, 3),(4, 5, 6)]) +b = np.append(a, [(7, 8, 9)]) +print(b) +>>> [1 2 3 4 5 6 7 8 9] + +# Remove index 2 from previous array +print(np.delete(b, 2)) +>>> [1 2 4 5 6 7 8 9] +``` + +### Combining Arrays +|Operator|Description|Documentation| +|:---------|:-------|:---------| +|`np.concatenate((a,b),axis=0)`|Concatenates 2 arrays, adds to end|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.concatenate.html)| +|`np.vstack((a,b))`|Stack array row-wise|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.vstack.html)| +|`np.hstack((a,b))`|Stack array column wise|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.hstack.html#numpy.hstack)| + +#### Example +```python +import numpy as np +a = np.array([1, 3, 5]) +b = np.array([2, 4, 6]) + +# Stack two arrays row-wise +print(np.vstack((a,b))) +>>> [[1 3 5] + [2 4 6]] + +# Stack two arrays column-wise +print(np.hstack((a,b))) +>>> [1 3 5 2 4 6] +``` + +### Splitting Arrays +|Operator|Description|Documentation| +|:---------|:-------|:------| +|`numpy.split()`||[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.split.html)| +|`np.array_split(array, 3)`|Split an array in sub-arrays of (nearly) identical size|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.array_split.html#numpy.array_split)| +|`numpy.hsplit(array, 3)`|Split the array horizontally at 3rd index|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.hsplit.html#numpy.hsplit)| + +#### Example +```python +# Split array into groups of ~3 +a = np.array([1, 2, 3, 4, 5, 6, 7, 8]) +print(np.array_split(a, 3)) +>>> [array([1, 2, 3]), array([4, 5, 6]), array([7, 8])] +``` +### Shaping Arrays +##### TODO +|Operator|Description|Documentation| +|:---------|:-------|:------| +|`other = ndarray.flatten()`|Flattens a 2d array to 1d|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.flatten.html)| +|numpy.flip()|Flips order of elements in 1D array|| +|np.ndarray[::-1]|Same as above|| +|reshape||| +|squeeze||| +|expand_dims||| + +### Misc +|Operator|Description|Documentation| +|:--------|:--------|:--------| +|`other = ndarray.flatten()`|Flattens a 2d array to 1d|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.flatten.html)| +|`array = np.transpose(other)`
`array.T` |Transpose array|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.transpose.html)| +|`inverse = np.linalg.inv(matrix)`|Inverse of a given matrix|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.inv.html) | +
+ +#### Example +```python +# Find inverse of a given matrix +>>> np.linalg.inv([[3,1],[2,4]]) +array([[ 0.4, -0.1], + [-0.2, 0.3]]) +``` + +## Mathematics + +### Operations +| Operator | Description |Documentation| +| :------------- | :------------- |:---------| +|`np.add(x,y)`
`x + y`|Addition|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.add.html)| +|`np.substract(x,y)`
`x - y`|Subtraction|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.subtract.html#numpy.subtract)| +|`np.divide(x,y)`
`x / y`|Division|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.divide.html#numpy.divide)| +|`np.multiply(x,y)`
`x @ y`|Multiplication|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.multiply.html#numpy.multiply)| +|`np.sqrt(x)`|Square Root|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.sqrt.html#numpy.sqrt)| +|`np.sin(x)`|Element-wise sine|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.sin.html#numpy.sin)| +|`np.cos(x)`|Element-wise cosine|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.cos.html#numpy.cos)| +|`np.log(x)`|Element-wise natural log|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.log.html#numpy.log)| +|`np.dot(x,y)`|Dot product|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html)| +|`np.roots([1,0,-4])`|Roots of a given polynomial coefficients|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.roots.html)| + +Remember: NumPy array operations work element-wise. + +#### Example +```python +# If a 1d array is added to a 2d array (or the other way), NumPy +# chooses the array with smaller dimension and adds it to the one +# with bigger dimension +a = np.array([1, 2, 3]) +b = np.array([(1, 2, 3), (4, 5, 6)]) +print(np.add(a, b)) +>>> [[2 4 6] + [5 7 9]] + +# Example of np.roots +# Consider a polynomial function (x-1)^2 = x^2 - 2*x + 1 +# Whose roots are 1,1 +>>> np.roots([1,-2,1]) +array([1., 1.]) +# Similarly x^2 - 4 = 0 has roots as x=±2 +>>> np.roots([1,0,-4]) +array([-2., 2.]) +``` + +### Comparison +| Operator | Description | Documentation | +| :------------- | :------------- |:---------| +|`==`|Equal|[link](https://docs.python.org/2/library/stdtypes.html)| +|`!=`|Not equal|[link](https://docs.python.org/2/library/stdtypes.html)| +|`<`|Smaller than|[link](https://docs.python.org/2/library/stdtypes.html)| +|`>`|Greater than|[link](https://docs.python.org/2/library/stdtypes.html)| +|`<=`|Smaller than or equal|[link](https://docs.python.org/2/library/stdtypes.html)| +|`>=`|Greater than or equal|[link](https://docs.python.org/2/library/stdtypes.html)| +|`np.array_equal(x,y)`|Array-wise comparison|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.array_equal.html)| + +#### Example +```python +# Using comparison operators will create boolean NumPy arrays +z = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) +c = z < 6 +print(c) +>>> [ True True True True True False False False False False] +``` +### Basic Statistics +| Operator | Description | Documentation | +| :------------- | :------------- |:--------- | +|`np.mean(array)`|Mean|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.mean.html#numpy.mean)| +|`np.median(array)`|Median|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.median.html#numpy.median)| +|`array.corrcoef()`|Correlation Coefficient|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.corrcoef.html#numpy.corrcoef)| +|`np.std(array)`|Standard Deviation|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.std.html#numpy.std)| + +#### Example +```python +# Statistics of an array +a = np.array([1, 1, 2, 5, 8, 10, 11, 12]) + +# Standard deviation +print(np.std(a)) +>>> 4.2938910093294167 + +# Median +print(np.median(a)) +>>> 6.5 +``` + + +### More +| Operator | Description | Documentation | +| :------------- | :------------- |:--------- | +|`array.sum()`|Array-wise sum|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.sum.html)| +|`array.min()`|Array-wise minimum value|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.min.html)| +|`array.max(axis=0)`|Maximum value of specified axis|| +|`array.cumsum(axis=0)`|Cumulative sum of specified axis|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.cumsum.html)| + +
+ +## Slicing and Subsetting +|Operator|Description|Documentation| +| :------------- | :------------- | :------------- | +|`array[i]`|1d array at index i|[link](https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html)| +|`array[i,j]`|2d array at index[i][j]|see above| +|`array[i<4]`|Boolean Indexing, see [Tricks](#tricks)|see above| +|`array[0:3]`|Select items of index 0, 1 and 2|see above| +|`array[0:2,1]`|Select items of rows 0 and 1 at column 1|see above| +|`array[:1]`|Select items of row 0 (equals array[0:1, :])|see above| +|`array[1:2, :]`|Select items of row 1|see above| +[comment]: <> (|`array[1,...]`|equals array[1,:,:]|see above|) +|`array[ : :-1]`|Reverses `array`|see above| + + +#### Examples +```python +b = np.array([(1, 2, 3), (4, 5, 6)]) + +# The index *before* the comma refers to *rows*, +# the index *after* the comma refers to *columns* +print(b[0:1, 2]) +>>> [3] + +print(b[:len(b), 2]) +>>> [3 6] + +print(b[0, :]) +>>> [1 2 3] + +print(b[0, 2:]) +>>> [3] + +print(b[:, 0]) +>>> [1 4] + +c = np.array([(1, 2, 3), (4, 5, 6)]) +d = c[1:2, 0:2] +print(d) +>>> [[4 5]] + +``` + +
+ +## Tricks +This is a growing list of examples. Know a good trick? Let me know in a issue or fork it and create a pull request. + +*boolean indexing* +```python +# Index trick when working with two np-arrays +a = np.array([1,2,3,6,1,4,1]) +b = np.array([5,6,7,8,3,1,2]) + +# Only saves a at index where b == 1 +other_a = a[b == 1] +#Saves every spot in a except at index where b != 1 +other_other_a = a[b != 1] +``` + +```python +import numpy as np +x = np.array([4,6,8,1,2,6,9]) +y = x > 5 +print(x[y]) +>>> [6 8 6 9] + +# Even shorter +x = np.array([1, 2, 3, 4, 4, 35, 212, 5, 5, 6]) +print(x[x < 5]) +>>> [1 2 3 4 4] + +``` + +