diff --git a/Pandas.md b/Pandas.md
new file mode 100644
index 0000000..f3df52e
--- /dev/null
+++ b/Pandas.md
@@ -0,0 +1,327 @@
+# Import
+```py
+import numpy as np
+import matplotlib.pyplot as plt
+import pandas as pd
+from pandas import DataFrame, Series
+
+%matplotlib inline
+%load_ext autoreload
+%autoreload 2
+
+# from __future__ import division
+from import_file import *
+from helpers.parallel_helper import *
+load_libs()
+
+```
+# Input
+```py
+df = DataFrame()
+
+#CSV
+df = pd.read_csv('file.csv')
+df = pd.read_csv('file.csv', header=0, index_col=0, quotechar='"',sep=':', na_values = ['na', '-', '.', ''])
+# specifying "." and "NA" as missing values in the Last Name column and "." as missing values in Pre-Test Score column
+df = pd.read_csv('../data/example.csv', na_values={'Last Name': ['.', 'NA'], 'Pre-Test Score': ['.']})
+df = pd.read_csv('../data/example.csv', na_values=sentinels, skiprows=3) # skipping the top 3 rows
+df = pd.read_csv('../data/example.csv', thousands=',') # interpreting "," in strings around numbers as thousands separators
+
+# CSV (Inline)
+from io import StringIO
+data = """, Animal, Cuteness, Desirable
+row-1, dog, 8.7, True
+row-2, cat, 9.5, True
+row-3, bat, 2.6, False"""
+df = pd.read_csv(StringIO(data),
+ header=0, index_col=0,
+ skipinitialspace=True)
+
+# JSON
+import json
+json_data = open('data-text.json').read()
+data = json.loads(json_data)
+for item in data:
+ print item
+
+# XML
+from xml.etree import ElementTree as ET
+tree = ET.parse('../../data/chp3/data-text.xml')
+root = tree.getroot()
+print root
+data = root.find('Data')
+all_data = []
+for observation in data:
+ record = {}
+ for item in observation:
+ lookup_key = item.attrib.keys()[0]
+ if lookup_key == 'Numeric':
+ rec_key = 'NUMERIC'
+ rec_value = item.attrib['Numeric']
+ else:
+ rec_key = item.attrib[lookup_key]
+ rec_value = item.attrib['Code']
+ record[rec_key] = rec_value
+ all_data.append(record)
+print all_data
+
+# Excel
+workbook = pd.ExcelFile('file.xlsx')
+d = {} # start with an empty dictionary
+for sheet_name in workbook.sheet_names: # Each Excel sheet in a Python dictionary
+ df = workbook.parse(sheet_name)
+ d[sheet_name] = df
+
+# MySQL
+import pymysql
+from sqlalchemy import create_engine
+engine = create_engine('mysql+pymysql://'
++'USER:PASSWORD@HOST/DATABASE')
+df = pd.read_sql_table('table', engine)
+(Back to top)
+
+
+
+### Combine DataFrame
+Data in Series then combine into a DataFrame
+```python
+# Example 1 ...
+s1 = Series(range(6))
+s2 = s1 * s1
+s2.index = s2.index + 2# misalign indexes
+df = pd.concat([s1, s2], axis=1)
+# Example 2 ...
+s3 = Series({'Tom':1, 'Dick':4, 'Har':9})
+s4 = Series({'Tom':3, 'Dick':2, 'Mar':5})
+df = pd.concat({'A':s3, 'B':s4 }, axis=1)
+```
+
+# Output
+```py
+# CSV
+df.to_csv('name.csv', encoding='utf-8')
+
+# Excel
+from pandas import ExcelWriter
+writer = ExcelWriter('filename.xlsx')
+df1.to_excel(writer,'Sheet1')
+df2.to_excel(writer,'Sheet2')
+writer.save()
+
+# MySQL
+import pymysql
+from sqlalchemy import create_engine
+e = create_engine('mysql+pymysql://' +
+ 'USER:PASSWORD@HOST/DATABASE')
+df.to_sql('TABLE',e, if_exists='replace')
+
+# Python object
+d = df.to_dict() # to dictionary
+str = df.to_string() # to string
+m = df.as_matrix() # to numpy matrix
+```
+
+# Import
+```py
+import numpy as np
+import matplotlib.pyplot as plt
+import pandas as pd
+from pandas import DataFrame, Series
+
+%matplotlib inline
+%load_ext autoreload
+%autoreload 2
+
+# from __future__ import division
+from import_file import *
+from helpers.parallel_helper import *
+load_libs()
+
+```
+# Input
+```py
+df = DataFrame()
+
+#CSV
+df = pd.read_csv('file.csv')
+df = pd.read_csv('file.csv', header=0, index_col=0, quotechar='"',sep=':', na_values = ['na', '-', '.', ''])
+# specifying "." and "NA" as missing values in the Last Name column and "." as missing values in Pre-Test Score column
+df = pd.read_csv('../data/example.csv', na_values={'Last Name': ['.', 'NA'], 'Pre-Test Score': ['.']})
+df = pd.read_csv('../data/example.csv', na_values=sentinels, skiprows=3) # skipping the top 3 rows
+df = pd.read_csv('../data/example.csv', thousands=',') # interpreting "," in strings around numbers as thousands separators
+
+# CSV (Inline)
+from io import StringIO
+data = """, Animal, Cuteness, Desirable
+row-1, dog, 8.7, True
+row-2, cat, 9.5, True
+row-3, bat, 2.6, False"""
+df = pd.read_csv(StringIO(data),
+ header=0, index_col=0,
+ skipinitialspace=True)
+
+# JSON
+import json
+json_data = open('data-text.json').read()
+data = json.loads(json_data)
+for item in data:
+ print item
+
+# XML
+from xml.etree import ElementTree as ET
+tree = ET.parse('../../data/chp3/data-text.xml')
+root = tree.getroot()
+print root
+data = root.find('Data')
+all_data = []
+for observation in data:
+ record = {}
+ for item in observation:
+ lookup_key = item.attrib.keys()[0]
+ if lookup_key == 'Numeric':
+ rec_key = 'NUMERIC'
+ rec_value = item.attrib['Numeric']
+ else:
+ rec_key = item.attrib[lookup_key]
+ rec_value = item.attrib['Code']
+ record[rec_key] = rec_value
+ all_data.append(record)
+print all_data
+
+# Excel
+workbook = pd.ExcelFile('file.xlsx')
+d = {} # start with an empty dictionary
+for sheet_name in workbook.sheet_names: # Each Excel sheet in a Python dictionary
+ df = workbook.parse(sheet_name)
+ d[sheet_name] = df
+
+# MySQL
+import pymysql
+from sqlalchemy import create_engine
+engine = create_engine('mysql+pymysql://'
++'USER:PASSWORD@HOST/DATABASE')
+df = pd.read_sql_table('table', engine)
+(Back to top)
+
+
+
+### Combine DataFrame
+Data in Series then combine into a DataFrame
+```python
+# Example 1 ...
+s1 = Series(range(6))
+s2 = s1 * s1
+s2.index = s2.index + 2# misalign indexes
+df = pd.concat([s1, s2], axis=1)
+# Example 2 ...
+s3 = Series({'Tom':1, 'Dick':4, 'Har':9})
+s4 = Series({'Tom':3, 'Dick':2, 'Mar':5})
+df = pd.concat({'A':s3, 'B':s4 }, axis=1)
+```
+
+# Output
+```py
+# CSV
+df.to_csv('name.csv', encoding='utf-8')
+
+# Excel
+from pandas import ExcelWriter
+writer = ExcelWriter('filename.xlsx')
+df1.to_excel(writer,'Sheet1')
+df2.to_excel(writer,'Sheet2')
+writer.save()
+
+# MySQL
+import pymysql
+from sqlalchemy import create_engine
+e = create_engine('mysql+pymysql://' +
+ 'USER:PASSWORD@HOST/DATABASE')
+df.to_sql('TABLE',e, if_exists='replace')
+
+# Python object
+d = df.to_dict() # to dictionary
+str = df.to_string() # to string
+m = df.as_matrix() # to numpy matrix
+```
+# Whole Dataframe
+## Content/Structure
+Peek at the DataFrame contents/structure
+```py
+df.info() # index & data types
+dfh = df.head(i) # get first i rows
+dft = df.tail(i) # get last i rows
+dfs = df.describe() # summary stats cols
+top_left_corner_df = df.iloc[:4, :4]
+data.tail().transpose()
+
+```
+## Non-indexing attributes
+DataFrame non-indexing attributes
+```py
+dfT = df.T # transpose rows and cols
+l = df.axes # list row and col indexes
+(r, c) = df.axes # from above
+s = df.dtypes # Series column data types
+b = df.empty # True for empty DataFrame
+i = df.ndim # number of axes (it is 2)
+t = df.shape # (row-count, column-count)
+i = df.size # row-count * column-count
+a = df.values # get a numpy array for df
+```
+
+## Utilities
+DataFrame utility methods
+```py
+df = df.copy() # copy a DataFrame
+df = df.rank() # rank each col (default)
+df = df.sort(['sales'], ascending=[False])
+df = df.sort_values(by=col)
+df = df.sort_values(by=[col1, col2])
+df = df.sort_index()
+df = df.astype(dtype) # type conversion
+```
+
+## Iterations
+DataFrame iteration methods
+```py
+df.iteritems()# (col-index, Series) pairs
+df.iterrows() # (row-index, Series) pairs
+# example ... iterating over columns
+for (name, series) in df.iteritems():
+ print('Col name: ' + str(name))
+ print('First value: ' +
+ str(series.iat[0]) + '\n')
+```
+
+## Maths
+Maths on the whole DataFrame (not a complete list)
+```py
+df = df.abs() # absolute values
+df = df.add(o) # add df, Series or value
+s = df.count() # non NA/null values
+df = df.cummax() # (cols default axis)
+df = df.cummin() # (cols default axis)
+df = df.cumsum() # (cols default axis)
+df = df.diff() # 1st diff (col def axis)
+df = df.div(o) # div by df, Series, value
+df = df.dot(o) # matrix dot product
+s = df.max() # max of axis (col def)
+s = df.mean() # mean (col default axis)
+s = df.median()# median (col default)
+s = df.min() # min of axis (col def)
+df = df.mul(o) # mul by df Series val
+s = df.sum() # sum axis (cols default)
+df = df.where(df > 0.5, other=np.nan)
+```
+Note: The methods that return a series default to working on columns.
+
+## Select/filter
+DataFrame select/filter rows/cols on label values
+```py
+df = df.filter(items=['a', 'b']) # by col
+df = df.filter(items=[5], axis=0) #by row
+df = df.filter(like='x') # keep x in col
+df = df.filter(regex='x') # regex in col
+df = df.select(lambda x: not x%5)#5th rows
+
+```
diff --git a/angular.md b/angular.md
new file mode 100644
index 0000000..b523d02
--- /dev/null
+++ b/angular.md
@@ -0,0 +1,37 @@
+# Angular CLI
+
+| Command | Meaning |
+|-----------------------------------------|--------------------------------------------------------------------------------|
+| | |
+| npm install -g @angular/cli | To install the Angular CLI into our local machine using npm, run this command. |
+| ng version | Displays the information about the currently installed CLI. |
+| ng new | Using the ng new command, a new Angular application will be created. |
+| ng new --prefix best | New project is created, and the project prefix is set to new. |
+| ng new --help | All available Angular commands are returned by this command. |
+| ng lint my-app | Linting warnings are checked against this command in our entire application. |
+| ng lint my-app --fix | This command will correct any form of linting errors. |
+| ng lint my-app --format stylish | Our entire codebase is formatted using this command. |
+| ng lint my-app --help | The list of linting commands is returned by this command. |
+| ng build | An application is created and stored in the dist directory using this command. |
+| ng serve | The local development server is launched, and the app is served locally in the browser. Port and open are both specified. When you change any of the source files, the app is rebuilt and reloaded, and the page is changed automatically. |
+| ng serve -o | This command opens up the application in a browser using any port 4200 or any available port |
+| ng serve -ssl | This command enables the application to be accessed using SSL. |
+| ng generate | To produce elements, services, components, classes, providers, pipes, and other types of modules. |
+| ng g c MyComponent -d | This dry runs the code and helps in cleaning the command line clean. |
+# Angular Lifecycle Hooks
+| ngOnChanges | The content is processed or child views are loaded before this hook is executed. It is also executed when the input properties of the component change. |
+|------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| ngOnInit | Data can be initialized in a component by calling this hook after input values are set. It is performed only once after input values are set. |
+| ngOnDestroy | You can use this hook to clean up memory and release resources and subscriptions after a component is destroyed. |
+| ngDoCheck | Any changes detected are handled using this hook. |
+| ngAfterContentInit | After performing content projection into the component's view, Angular invokes this hook before evaluating the expression. |
+| ngAfterContentChecked | Angular's change detection mechanism checks the content of all components once every time they are rendered, so this hook is called each time change is detected. |
+| ngAfterViewChecked | This hook is invoked after every check of the component's views and its child views. |
+# DECORATORS
+ | Class Decorators | Details |
+|-------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| @Component({...}) class MyComponent() {} | Metadata about a component is declared as part of the class definition. |
+| @Directive({...})class MyDirective() {} | Declares the class as a directive and provides metadata about the directive |
+| @Pipe({...}) class MyPipe() {} | Declares the class as a pipe and provides metadata about the pipe. |
+| @Injectable() class MyService() {} | This declares that class can be injected and provided. Without this decorator, the compiler does not generate enough metadata to allow the class to be created properly when it is injected somewhere. |
+| import { Directive, ... } from'@angular/core'; | This imports the Directive from @angular/core |
diff --git a/numpy.md b/numpy.md
new file mode 100644
index 0000000..378c6db
--- /dev/null
+++ b/numpy.md
@@ -0,0 +1,380 @@
+# 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* (available as separate `.py` file [here](https://github.com/JulianGaal/python-cheat-sheet/blob/master/code/boolean-indexing.py)
+```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]
+
+```
+
+
+