# NumPy [NumPy](http://www.numpy.org) is the fundamental package for scientific computing with Python. ## Basics <a name="basics"></a> 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 basic statistics, linear algebra, histograms, etc.</br> The most important difference for data science is the ability to do **element-wise calculations** with *NumPy arrays*. `axis 0` always refers to row </br> `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)| | 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.randint(0, 5, (5,5))`|Creates random array|[link](https://numpy.org/doc/stable/reference/random/generated/numpy.random.randint.html)| |`np.empty((2,2))`|Creates an empty array|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.empty.html)| ### Examples <a name="ex"></a> ```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]) ``` </br> ## Array <a name="arrays"></a> ### Array Properties <a name="props"></a> |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 <a name="gops"></a> | 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 Manipulation Routines <a name="man"></a> ### Slicing and Subsetting <a name="ss"></a> |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 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 <a name="exp"></a> ```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]] ``` </br> ### Combining Arrays <a name="comb"></a> |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 <a name="array-combine-examples"></a> ```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] ``` ### Shaping Arrays <a name="shape"></a> |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)| |`ravel`|Return a contiguous flattened array|[link](https://numpy.org/doc/stable/reference/generated/numpy.ravel.html)| |`reshape`|reshape an array|[link](https://numpy.org/doc/stable/reference/generated/numpy.reshape.html)| |`resize`|Return a new array with the specified shape|[link](https://numpy.org/doc/stable/reference/generated/numpy.resize.html)| |`array = np.transpose(other)`</br> `array.T` |Transpose array|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.transpose.html)| </br> ## Mathematics <a name="maths"></a> ### Operations <a name="ops"></a> | Operator | Description |Documentation| | :------------- | :------------- |:---------| |`np.add(x,y)`<br/>`x + y`|Addition|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.add.html)| |`np.substract(x,y)`<br/>`x - y`|Subtraction|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.subtract.html#numpy.subtract)| |`np.divide(x,y)`<br/>`x / y`|Division|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.divide.html#numpy.divide)| |`np.multiply(x,y)`<br/>`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, `x @ y`|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html)| Remember: NumPy array operations work element-wise. #### Example <a name="operations-examples"></a> ```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]] ``` ### Comparison | Operator | Description | Documentation | | :------------- | :------------- |:---------| |`np.array_equal(x,y)`|Array-wise comparison|[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.array_equal.html)| #### Example <a name="comparison-example"></a> ```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] ``` ### More (Reduction) <a name="more"></a> | 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|| </br>