Skip to content

Instantly share code, notes, and snippets.

@MBoustani
Created April 26, 2022 20:50
Show Gist options
  • Save MBoustani/344feb83ae238be931a79dc2431926d9 to your computer and use it in GitHub Desktop.
Save MBoustani/344feb83ae238be931a79dc2431926d9 to your computer and use it in GitHub Desktop.
Comprehensive list of NumPy functions with example code
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"id": "ad350362",
"metadata": {},
"source": [
"- `Written By :` Mazi Boustani\n",
"\n",
"- `Date :` 04/24/2022\n",
"\n",
"- `Purpose :` Comprehensive list of NumPy functions with example code\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "28780a6a",
"metadata": {},
"outputs": [],
"source": [
"import numpy as np"
]
},
{
"cell_type": "markdown",
"id": "28bdf1b9",
"metadata": {},
"source": [
"### Basics of an array"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "7cd83d7f",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[[1.0, 0.0, 6.0], [2.0, 4.0, 3.0]]"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# First axis is row, second axis is column.\n",
"# First axis has length of 2 (2 rows), second axis has length of 3 (3 columns)\n",
"[[1., 0., 6.],\n",
" [2., 4., 3.]]"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "e6df5184",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"__init_numpy_array__\n",
"[[1 2]\n",
" [3 0]\n",
" [0 6]]\n",
"__float_numpy_array__\n",
"[[1. 2.]\n",
" [3. 0.]\n",
" [0. 6.]]\n",
"__string_numpy_array__\n",
"[['1' '2']\n",
" ['3' '0']\n",
" ['0' '6']]\n",
"__boolean_numpy_array__\n",
"[[ True True]\n",
" [ True False]\n",
" [False True]]\n"
]
}
],
"source": [
"# To create a NumPy array, create a Python array then pass it to np.array\n",
"array = [[1,2],\n",
" [3,0], \n",
" [0,6]]\n",
"\n",
"init_numpy_array = np.array(array)\n",
"float_numpy_array = np.array(array, dtype=np.float) # set data type while creating an array\n",
"string_numpy_array = np.array(array, dtype=np.str)\n",
"boolean_numpy_array = np.array(array, dtype=np.bool)\n",
"\n",
"print(\"__init_numpy_array__\")\n",
"print(init_numpy_array)\n",
"print(\"__float_numpy_array__\")\n",
"print(float_numpy_array)\n",
"print(\"__string_numpy_array__\")\n",
"print(string_numpy_array)\n",
"print(\"__boolean_numpy_array__\") \n",
"print(boolean_numpy_array) # True for non-zero, False for zero\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "c17596df",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Type of array: int64\n",
"Number of dimensions: 2\n",
"Shape of array: (3, 2)\n",
"Size of array: 6\n"
]
}
],
"source": [
"# Getting some attributes of an array\n",
"\n",
"print(\"Type of array: \", init_numpy_array.dtype)\n",
"print(\"Number of dimensions: \", init_numpy_array.ndim)\n",
"print(\"Shape of array: \", init_numpy_array.shape)\n",
"print(\"Size of array: \", init_numpy_array.size) # size is total items count, regardless of shape\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "680cc6ba",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"__array__\n",
"[[1 2]\n",
" [3 0]\n",
" [0 6]]\n",
"Total sum: 12\n",
"Total mean: 2.0\n",
"Total std: 2.0816659994661326\n",
"Total min: 0\n",
"Total max: 6\n",
"Total cumsum: [ 1 3 6 6 6 12]\n",
"___\n",
"Sum over rows: [4 8]\n",
"Sum over cols: [3 3 6]\n",
"Sum first col: 4\n",
"___\n",
"Argmax flat: 5\n",
"Argmax row: [1 2]\n",
"Argmax col: [1 0 1]\n",
"Max value: 6\n",
"Max value in rows: [3 6]\n",
"Max value in cols: [2 3 6]\n"
]
}
],
"source": [
"# Running basic mathematical functions on arrays\n",
"\n",
"array = np.array([[1,2],\n",
" [3,0], \n",
" [0,6]])\n",
"print(\"__array__\")\n",
"print(array)\n",
"\n",
"print(\"Total sum: \", array.sum())\n",
"print(\"Total mean: \", array.mean())\n",
"print(\"Total std: \", array.std())\n",
"print(\"Total min: \", array.min())\n",
"print(\"Total max: \", array.max())\n",
"print(\"Total cumsum: \", array.cumsum())\n",
"\n",
"print(\"___\")\n",
"\n",
"print(\"Sum over rows: \", array.sum(axis=0))\n",
"print(\"Sum over cols: \", array.sum(axis=1))\n",
"print(\"Sum first col: \", array[:,0].sum())\n",
"\n",
"print(\"___\")\n",
"\n",
"print(\"Argmax flat: \", np.argmax(array)) # Return index of max element in an array (not the element)\n",
"print(\"Argmax row: \", np.argmax(array, axis=0)) # Return index of max element of cols between rows\n",
"print(\"Argmax col: \", np.argmax(array, axis=1)) # Return index of max element of rows between cols\n",
"\n",
"print(\"Max value: \", np.amax(array)) # Return max element in entire array\n",
"print(\"Max value in rows: \", np.amax(array, axis=0)) # Return max element in rows\n",
"print(\"Max value in cols: \", np.amax(array, axis=1)) # Return max elements in cols\n",
"\n",
"# Argmin and amin are function for finding min index and min value\n"
]
},
{
"cell_type": "code",
"execution_count": 40,
"id": "a146e7e4",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Current data type : int64\n",
"Float data type : float64\n",
"String data type : <U21\n"
]
}
],
"source": [
"# Change the data dtype of existing NumPy array\n",
"\n",
"array = np.array([[1,2],\n",
" [3,0], \n",
" [0,6]])\n",
"\n",
"print(\"Current data type :\", array.dtype)\n",
"\n",
"# Change the type to float\n",
"float_array = array.astype(np.float)\n",
"print(\"Float data type :\", float_array.dtype)\n",
"\n",
"# Change the type to string\n",
"string_array = array.astype(np.str)\n",
"print(\"String data type :\", string_array.dtype)\n"
]
},
{
"cell_type": "code",
"execution_count": 41,
"id": "d1802c05",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Range 1: [0 1 2 3 4 5 6 7 8 9]\n",
"Range 2: [0 1 2 3 4 5 6 7 8 9]\n",
"Range 3: [10 9 8 7 6 5 4 3 2 1]\n",
"Range 4: [1.1 1.4 1.7 2. 2.3 2.6 2.9 3.2 3.5 3.8 4.1]\n",
"Llinspace 1 : [ 0. 2.5 5. 7.5 10. ]\n",
"Llinspace 2 : [1.1 1.45555556 1.81111111 2.16666667 2.52222222 2.87777778\n",
" 3.23333333 3.58888889 3.94444444 4.3 ]\n"
]
}
],
"source": [
"# Create a NumPy range of numbers. np.arange(start, stop, step, dtype)\n",
"\n",
"range_1 = np.arange(0, 10, 1) # stop (10) is excluded\n",
"print(\"Range 1: \", range_1)\n",
"\n",
"range_2 = np.arange(10) # same as range_1, defaul start is 0, defautl step is 1\n",
"print(\"Range 2: \", range_2)\n",
"\n",
"range_3 = np.arange(10, 0, -1) # reverse order\n",
"print(\"Range 3: \", range_3)\n",
"\n",
"range_4 = np.arange(1.1, 4.3, .3) # range with float numbers\n",
"print(\"Range 4: \", range_4)\n",
"\n",
"# Create evenly spaced numbers over a specified interval\n",
"linspace_1 = np.linspace(0, 10, 5) # (start, stop, number of samples)\n",
"print(\"Llinspace 1 :\", linspace_1)\n",
"\n",
"linspace_2 = np.linspace(1.1, 4.3, 10) # 10 numbers starting 1.1 and ending 4.3 \n",
"print(\"Llinspace 2 :\", linspace_2)\n"
]
},
{
"cell_type": "code",
"execution_count": 42,
"id": "f3813493",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"__zeors_array__\n",
"[[0. 0. 0. 0.]\n",
" [0. 0. 0. 0.]\n",
" [0. 0. 0. 0.]]\n",
"__ones_array__\n",
"[[1. 1. 1. 1.]\n",
" [1. 1. 1. 1.]\n",
" [1. 1. 1. 1.]]\n",
"__empty_array__\n",
"[[1. 1. 1. 1.]\n",
" [1. 1. 1. 1.]\n",
" [1. 1. 1. 1.]]\n",
"__full_array__\n",
"[[44 44 44 44]\n",
" [44 44 44 44]\n",
" [44 44 44 44]]\n",
"__full_array_bool__\n",
"[[False False False False]\n",
" [False False False False]\n",
" [False False False False]]\n",
"__full_like_array__\n",
"[[22 22]\n",
" [22 22]\n",
" [22 22]]\n",
"__tile_array__\n",
"[3 3 3 3]\n",
"__tile_array_2__\n",
"[[3 3 3 3]\n",
" [3 3 3 3]\n",
" [3 3 3 3]\n",
" [3 3 3 3]\n",
" [3 3 3 3]]\n",
"__repeat_array__\n",
"[1 1 1 1 2 2 2 2 3 3 3 3]\n",
"__tile_array_of_a_list__\n",
"[1 2 3 1 2 3 1 2 3]\n",
"___\n",
"__array__\n",
"[[1 2]\n",
" [3 0]\n",
" [0 6]]\n",
"__repeat_each_row__\n",
"[[1 2]\n",
" [1 2]\n",
" [3 0]\n",
" [3 0]\n",
" [0 6]\n",
" [0 6]]\n",
"__repeat_each_col__\n",
"[[1 1 2 2]\n",
" [3 3 0 0]\n",
" [0 0 6 6]]\n"
]
}
],
"source": [
"# Create a zeros array, all values are zero\n",
"zeors_array = np.zeros((3,4)) # shape of 3,4\n",
"print(\"__zeors_array__\")\n",
"print(zeors_array)\n",
"\n",
"# Create an ones array, all values are one\n",
"ones_array = np.ones((3,4)) # shape of 3,4\n",
"print(\"__ones_array__\")\n",
"print(ones_array)\n",
"\n",
"# Create an empty array, all values are some random number to be replaced later\n",
"empty_array = np.empty((3,4)) # shape of 3,4\n",
"print(\"__empty_array__\")\n",
"print(empty_array)\n",
"\n",
"# Create a full array, all values are set to value you set\n",
"full_array = np.full((3,4), 44) # shape of 3,4. Set value 44\n",
"print(\"__full_array__\")\n",
"print(full_array)\n",
"full_array_bool = np.full((3,4), False) # shape of 3,4. Set value False\n",
"print(\"__full_array_bool__\")\n",
"print(full_array_bool)\n",
"\n",
"# Create a full_like array, all values are set to value you set, but shape is same as given array\n",
"full_like_array = np.full_like(array, 22) # shape same as given array, all values 22\n",
"print(\"__full_like_array__\")\n",
"print(full_like_array)\n",
"\n",
"# Create a tile array, all values are set to value you set\n",
"tile_array = np.tile(3, 4) # repeat value 3 for 4 times\n",
"print(\"__tile_array__\")\n",
"print(tile_array)\n",
"tile_array_2 = np.tile(3, (5,4)) # repeat 3, in the shape 5,4. Value can also be an array to repeat\n",
"print(\"__tile_array_2__\")\n",
"print(tile_array_2)\n",
"\n",
"# Create repeat array, all values are set to value you set\n",
"repeat_array = np.repeat([1,2,3], 4) # repeat each item for 4 times.\n",
"print(\"__repeat_array__\")\n",
"print(repeat_array)\n",
"print(\"__tile_array_of_a_list__\")\n",
"print(np.tile([1,2,3], 3)) # compare this with `repeat_array`, it repeats the list for 3 times\n",
"\n",
"print(\"___\")\n",
"\n",
"print(\"__array__\")\n",
"print(array)\n",
"print(\"__repeat_each_row__\")\n",
"repeat_each_row = np.repeat(array, 2, axis=0) # repeat each row (axis=0) 2 times\n",
"print(repeat_each_row)\n",
"print(\"__repeat_each_col__\")\n",
"repeat_each_col = np.repeat(array, 2, axis=1) # repeat each col (axis=1) 2 times\n",
"print(repeat_each_col)\n"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "150dccac",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"__identity_array__\n",
"[[1. 0. 0. 0.]\n",
" [0. 1. 0. 0.]\n",
" [0. 0. 1. 0.]\n",
" [0. 0. 0. 1.]]\n",
"__upper_eye_array__\n",
"[[0. 1. 0. 0.]\n",
" [0. 0. 1. 0.]\n",
" [0. 0. 0. 1.]]\n",
"__lower_eye_array__\n",
"[[0. 0. 0. 0.]\n",
" [1. 0. 0. 0.]\n",
" [0. 1. 0. 0.]]\n"
]
}
],
"source": [
"# Create an identity array: 2-D array with ones on the diagonal and zeros elsewhere\n",
"identity_array = np.identity(4) # only one dimension given\n",
"print(\"__identity_array__\")\n",
"print(identity_array)\n",
"\n",
"# Create an eye array: 2-D array with ones on the diagonal and zeros elsewhere, shape can be anything\n",
"# If K=0 and shape is same for each dimension, eye is same as identity\n",
"upper_eye_array = np.eye(3,4, k=1) # shape of (3,4). K positive for upper ones\n",
"print(\"__upper_eye_array__\")\n",
"print(upper_eye_array)\n",
"lower_eye_array = np.eye(3,4, k=-1) # shape of (3,4). K positive for lower ones\n",
"print(\"__lower_eye_array__\")\n",
"print(lower_eye_array)\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "4432793f",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"__A__\n",
"[[1 2]\n",
" [3 0]\n",
" [0 6]]\n",
"__B_is_A__\n",
"B is A?: True\n",
"B share memory with A: True\n",
"__updated_A__\n",
"[[1000 2]\n",
" [ 3 0]\n",
" [ 0 6]]\n",
"__C__\n",
"[[1000 2]\n",
" [ 3 0]\n",
" [ 0 6]]\n",
"C is A?: False\n",
"C share memory with A: False\n"
]
}
],
"source": [
"# Copy vs view of an array\n",
"A = np.array([[1,2],\n",
" [3,0], \n",
" [0,6]])\n",
"print(\"__A__\")\n",
"print(A)\n",
"\n",
"# This is not a copy. B is just another name for A not a new array\n",
"B = A\n",
"print(\"__B_is_A__\")\n",
"print(\"B is A?: \", B is A)\n",
"print(\"B share memory with A: \", np.shares_memory(A, B))\n",
"\n",
"# Changing B will change A as well\n",
"B[0,0] = 1000\n",
"print(\"__updated_A__\")\n",
"print(A)\n",
"\n",
"# To make a new array you can use .copy(). Updating C does not update A.\n",
"C = A.copy()\n",
"print(\"__C__\")\n",
"print(C)\n",
"print(\"C is A?: \", C is A)\n",
"print(\"C share memory with A: \", np.shares_memory(A, C))\n",
"\n"
]
},
{
"cell_type": "markdown",
"id": "ff647e5e",
"metadata": {},
"source": [
"### Random array"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "c0d3d0e4",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"__random_array__\n",
"[[0.51182162 0.9504637 0.14415961]\n",
" [0.94864945 0.31183145 0.42332645]\n",
" [0.82770259 0.40919914 0.54959369]\n",
" [0.02755911 0.75351311 0.53814331]]\n",
"__random_array__\n",
"[[0.13125426 0.76558875 0.92163279]\n",
" [0.85965555 0.60504508 0.99208754]\n",
" [0.31149952 0.83830594 0.82814844]\n",
" [0.63133765 0.79802764 0.79872472]]\n",
"__random_normal_array_1__\n",
"[[-2.02725588 -1.91725921 -2.26475291]\n",
" [-0.24019159 -0.35239181 0.51650522]\n",
" [ 0.49097254 0.93025098 0.84880112]\n",
" [-0.14632408 -0.48857646 -0.33392866]]\n",
"__random_normal_array_2__\n",
"[3.1939988 2.87003446 2.83742667 3.0200198 3.07124875 3.02254081\n",
" 3.10035553 2.9707152 3.05781803 3.03399613]\n",
"__random_init_array_1__\n",
"[5 7 4 4 6 7 7 2 5 4]\n",
"__random_init_array_2__\n",
"[[4 5 4]\n",
" [3 7 6]\n",
" [4 2 6]\n",
" [2 3 4]]\n",
"__random_init_array_3__\n",
"[[3 5 1]\n",
" [7 0 6]\n",
" [2 6 3]\n",
" [2 6 7]]\n"
]
}
],
"source": [
"# Generate some random arrays\n",
"\n",
"# Construct a new Generator with the default BitGenerator (PCG64).\n",
"random_generator = np.random.default_rng(seed=1)\n",
"print(\"__random_array__\")\n",
"print(random_generator.random((4,3))) # random array shape 4,3\n",
"\n",
"print(\"__random_array__\")\n",
"print(np.random.rand(4,3))\n",
"\n",
"# Return a samples from the \"standard normal\" distribution\n",
"print(\"__random_normal_array_1__\")\n",
"print(np.random.randn(4,3))\n",
"\n",
"# Draw random samples from a normal (Gaussian) distribution\n",
"print(\"__random_normal_array_2__\")\n",
"print(np.random.normal(size=10, loc=3, scale=.2)) # 10 points with mean of 3 and with std of 0.2\n",
"\n",
"print(\"__random_init_array_1__\")\n",
"print(np.random.randint(2, 8, size=10)) # low=2, high=8, size is shape\n",
"\n",
"print(\"__random_init_array_2__\")\n",
"print(np.random.randint(2, 8, size=(4,3))) # low=2, high=8, size is shape\n",
"\n",
"print(\"__random_init_array_3__\")\n",
"print(np.random.randint(8, size=(4,3))) # low=0, high=8, size is shape\n"
]
},
{
"cell_type": "markdown",
"id": "1f0f6fa6",
"metadata": {},
"source": [
"### Basic Operations"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "7becb7ae",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"__A__\n",
"[0 1 2 3]\n",
"__B__\n",
"[5 6 7 8]\n",
"__A+B__\n",
"[ 5 7 9 11]\n",
"A and C share memory: False\n",
"__A*B*np.sin(A)__\n",
"[ 0. 5.04882591 12.73016398 3.38688019]\n",
"__A@B__\n",
"44\n",
"__exp(A)__\n",
"[ 1. 2.71828183 7.3890561 20.08553692]\n",
"__sqrt(A)__\n",
"[0. 1. 1.41421356 1.73205081]\n",
"__A+=B__\n",
"[ 5 7 9 11]\n",
"__A*=B__\n",
"[25 42 63 88]\n",
"__A//=B__\n",
"[ 5 7 9 11]\n"
]
}
],
"source": [
"A = np.arange(0,4)\n",
"B = np.arange(5,9)\n",
"print(\"__A__\")\n",
"print(A)\n",
"print(\"__B__\")\n",
"print(B)\n",
"\n",
"# Adding to new variable creates a new copy of data, does not change original arrays\n",
"C = A + B # A and B has to be same shape, or refer to broadcasting section.\n",
"print(\"__A+B__\")\n",
"print(C) # same as np.add(A,B). For subtract use np.subtract(A,B)\n",
"print(\"A and C share memory: \", np.shares_memory(C, A)) # C and A are different arrays in memory\n",
"\n",
"C = A * B * np.sin(A)\n",
"print(\"__A*B*np.sin(A)__\")\n",
"print(C)\n",
"\n",
"# Dot product of two arrays. Specifically.\n",
"C = A @ B\n",
"print(\"__A@B__\")\n",
"print(C)\n",
"\n",
"# Calculate exponential of all elements\n",
"print(\"__exp(A)__\")\n",
"print(np.exp(A))\n",
"\n",
"# Calculate non-negative square-root of all elements\n",
"print(\"__sqrt(A)__\")\n",
"print(np.sqrt(A))\n",
"\n",
"# Operations bellow happen in-place, means it changes the original array\n",
"A+=B\n",
"print(\"__A+=B__\")\n",
"print(A) # array A has changed forever, not a view anymore\n",
"\n",
"A*=B\n",
"print(\"__A*=B__\")\n",
"print(A) # array A has changed forever, not a view anymore\n",
"\n",
"A//=B\n",
"print(\"__A//=B__\")\n",
"print(A) # array A has changed forever, not a view anymore\n"
]
},
{
"cell_type": "markdown",
"id": "a4e27be4",
"metadata": {},
"source": [
"### Flattening array"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "3e906947",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"__array__\n",
"[[1 2]\n",
" [3 0]\n",
" [0 6]]\n",
"__flat_array__\n",
"[1, 2, 3, 0, 0, 6]\n",
"__flatten_array__\n",
"[1 2 3 0 0 6]\n",
"Share memory with array: False\n",
"__ravel_array__\n",
"[1 2 3 0 0 6]\n",
"Share memory with array: True\n",
"__flat_non-zero_indexes__\n",
"[0 1 2 5]\n",
"__non-zero_elements__\n",
"[1 2 3 6]\n"
]
}
],
"source": [
"array = np.array([[1,2],\n",
" [3,0], \n",
" [0,6]])\n",
"print(\"__array__\")\n",
"print(array)\n",
"\n",
"print(\"__flat_array__\")\n",
"print([each for each in array.flat]) # A 1-D iterator over the array\n",
"\n",
"print(\"__flatten_array__\")\n",
"print(array.flatten()) # Return a copy of the array collapsed into one dimension.\n",
" # Note: a new copy being put in memory. Not just a view.\n",
"print(\"Share memory with array: \", np.shares_memory(array.flatten(), array))\n",
"\n",
"print(\"__ravel_array__\")\n",
"print(np.ravel(array)) # just a flat view, does not create a new copy\n",
" \n",
"print(\"Share memory with array: \", np.shares_memory(np.ravel(array), array))\n",
" \n",
"print(\"__flat_non-zero_indexes__\")\n",
"print(np.flatnonzero(array)) # Return indexes of non-zero itmes in flat format\n",
"print(\"__non-zero_elements__\")\n",
"print(np.ravel(array)[np.flatnonzero(array)])\n"
]
},
{
"cell_type": "markdown",
"id": "46c91c28",
"metadata": {},
"source": [
"### Indexing, Slicing and iterating"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "de06b2d6",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"__array__\n",
"[[1 2 3]\n",
" [3 0 4]\n",
" [0 6 5]]\n",
"__slice_1__\n",
"2\n",
"__slice_2__\n",
"[1 2 3]\n",
"__slice_3__\n",
"[2 0 6]\n",
"__slice_4__\n",
"[2 0]\n",
"__slice_5__\n",
"[3 4 5]\n",
"__slice_6__\n",
"[[1 2 3]\n",
" [3 0 4]]\n",
"__reverse_array_row__\n",
"[[0 6 5]\n",
" [3 0 4]\n",
" [1 2 3]]\n",
"__reverse_array_col__\n",
"[[3 2 1]\n",
" [4 0 3]\n",
" [5 6 0]]\n",
"__reverse_array_row_col__\n",
"[[5 6 0]\n",
" [4 0 3]\n",
" [3 2 1]]\n",
"Same as np.flip: True\n",
"__every_other_element_row__\n",
"[[1 2 3]\n",
" [0 6 5]]\n",
"__every_other_element_col__\n",
"[[1 3]\n",
" [3 4]\n",
" [0 5]]\n",
"__transpose_array__\n",
"[[1 3 0]\n",
" [2 0 6]\n",
" [3 4 5]]\n"
]
}
],
"source": [
"array = np.array([[1,2,3],\n",
" [3,0,4], \n",
" [0,6,5]])\n",
"print(\"__array__\")\n",
"print(array)\n",
"\n",
"# If 1D array then: array[index]\n",
"# If 2D array then: array[row_filter, col_filterstep] separated with comma\n",
"# If 3D array[sheet_filter, row_filter, col_filter]\n",
"# If any dimension not mentioned means all of that dimension: \n",
"# array[3] mean row index 2 and all columns, same as array[3,:]\n",
"\n",
"# If 2D: array[start_row : stop_row : step_row , start_col : stop_col, step_col ]\n",
"\n",
"# When fewer indices are provided than the number of axes, the missing indices are considered complete slices:\n",
"# array[0] this means all columns in first row same as array[0, :]\n",
"\n",
"print(\"__slice_1__\")\n",
"print(array[0,1]) # get first row (index 0) and second col (index 1)\n",
"\n",
"print(\"__slice_2__\") \n",
"print(array[0]) # get first row (index 0) and all columns, same as array[0,:]\n",
"\n",
"print(\"__slice_3__\")\n",
"print(array[:,1]) # get all rows and second col (index 1)\n",
"\n",
"print(\"__slice_4__\")\n",
"print(array[0:2,1]) # get first and second row and second col (index 1) \n",
"\n",
"print(\"__slice_5__\")\n",
"print(array[:,-1]) # get all rows and last column\n",
"\n",
"print(\"__slice_6__\")\n",
"print(array[:-1]) # get all rows except last row\n",
"\n",
"print(\"__reverse_array_row__\")\n",
"print(array[::-1]) # step -1 means move from last to first row\n",
"\n",
"print(\"__reverse_array_col__\")\n",
"print(array[:,::-1]) # step -1 means move from last to first col\n",
"\n",
"print(\"__reverse_array_row_col__\")\n",
"print(array[::-1,::-1]) # reverse row and column same as np.flip\n",
"print(\"Same as np.flip: \", np.array_equal(np.flip(array), array[::-1, ::-1]))\n",
"\n",
"print(\"__every_other_element_row__\")\n",
"print(array[::2]) # every other row\n",
"\n",
"print(\"__every_other_element_col__\")\n",
"print(array[:, ::2]) # every other col\n",
"\n",
"print(\"__transpose_array__\")\n",
"print(array.T) # same as np.transpose(array)\n"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "4424095b",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"__array__\n",
"[[1 2 3]\n",
" [3 0 4]\n",
" [0 6 5]]\n",
"__slicing_1__\n",
"[2 4]\n",
"__slicing_2__\n",
"[2 1 5]\n",
"__ix_1__\n",
"(array([[0],\n",
" [1]]), array([[1, 2]]))\n",
"[[2 3]\n",
" [0 4]]\n",
"[[2 3]\n",
" [0 4]]\n",
"__ix_2__\n",
"[[3 3]\n",
" [4 4]]\n"
]
}
],
"source": [
"array = np.array([[1,2,3],\n",
" [3,0,4], \n",
" [0,6,5]])\n",
"print(\"__array__\")\n",
"print(array)\n",
"\n",
"# Slicing using list of rows and cols (2D example). array([list of rows], [list of cols])\n",
"print(\"__slicing_1__\")\n",
"print(array[[0,1], [1,2]]) # Return (Row 0 and Col 1) and (Row 1 and col 2)\n",
"\n",
"print(\"__slicing_2__\")\n",
"print(array[[0,0,2], [1,0,2]]) # Return (Row 0 and Col 1) and (Row 0 and col 0) and (Row 2 and col 2)\n",
"\n",
"\n",
"# Construct an open mesh from multiple sequences\n",
"print(\"__ix_1__\")\n",
"print(np.ix_([0,1], [1,2])) # Returns indices of: [[0,1], [0,2], [1,1], [1,2]]\n",
"print(array[np.ix_([0,1], [1,2])])\n",
"print(array[[0, 0, 1, 1], [1, 2, 1, 2]].reshape(2,2)) # Same as line above\n",
"\n",
"print(\"__ix_2__\")\n",
"print(array[np.ix_([0,1], [2,2])]) # Order does not matter, duplication is allowed\n"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "fe0a9a6e",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"__array__\n",
"[[ 1 2 3]\n",
" [ 3 13 4]\n",
" [ 0 6 5]]\n",
"__basic_indexing__\n",
"13\n",
"__advanced_indexing__\n",
"[[ 3 13 4]\n",
" [ 3 13 4]]\n"
]
}
],
"source": [
"# Basic vs Advanced Indexing\n",
"array = np.array([[1,2,3],\n",
" [3,13,4], \n",
" [0,6,5]])\n",
"print(\"__array__\")\n",
"print(array)\n",
"\n",
"# Using tuple triggers basic indexing \n",
"print(\"__basic_indexing__\")\n",
"print(array[(1,1)])\n",
"\n",
"print(\"__advanced_indexing__\")\n",
"# Using list triggers basic indexing \n",
"print(array[[1,1]])\n"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "c182a1be",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Shape of A: (5, 5)\n",
"Shape of B: (5, 5, 3)\n",
"A new shape: (5, 5, 1)\n",
"__A+B__\n",
"[[[ 0 1 2]\n",
" [ 4 5 6]\n",
" [ 8 9 10]\n",
" [12 13 14]\n",
" [16 17 18]]\n",
"\n",
" [[20 21 22]\n",
" [24 25 26]\n",
" [28 29 30]\n",
" [32 33 34]\n",
" [36 37 38]]\n",
"\n",
" [[40 41 42]\n",
" [44 45 46]\n",
" [48 49 50]\n",
" [52 53 54]\n",
" [56 57 58]]\n",
"\n",
" [[60 61 62]\n",
" [64 65 66]\n",
" [68 69 70]\n",
" [72 73 74]\n",
" [76 77 78]]\n",
"\n",
" [[80 81 82]\n",
" [84 85 86]\n",
" [88 89 90]\n",
" [92 93 94]\n",
" [96 97 98]]]\n"
]
}
],
"source": [
"# Array Broadcasting\n",
"# Broadcasting describes how NumPy treats arrays with different shapes during arithmetic operations.\n",
"\n",
"A = np.arange(25).reshape(5,5)\n",
"B = np.arange(75).reshape(5,5,3)\n",
"print(\"Shape of A:\", A.shape)\n",
"print(\"Shape of B:\", B.shape)\n",
"\n",
"# As you can see shape of A and B are not same, we cannot broadcast them together\n",
"# np.add(A, B) will give us an error. \n",
"# To solve this we can add another dimension to A using np.newaxis\n",
"\n",
"A = A[:,:, np.newaxis]\n",
"print(\"A new shape: \", A.shape)\n",
"\n",
"# Now we can add two arrays of A and B\n",
"print(\"__A+B__\")\n",
"print(np.add(A, B))\n",
"\n",
"# Broadcasting is only allowed if two arrays have same dimensions \n",
"# of one dimension is 1 and the other can be any value\n",
"# For example: (3,4,1)+(3,4,9) is ok\n",
"# (3,4,2)+(3,4,9) is not ok as third dimension if first array is 2 and second array is 9\n"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "f1c852b4",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"__array__\n",
"[[ 9 10 3 4]\n",
" [ 3 8 18 3]\n",
" [10 19 9 15]\n",
" [ 9 2 7 3]]\n",
"__X__\n",
"[[ 9 10]\n",
" [ 3 8]]\n",
"X share memory with array: True\n",
"__updated_X__\n",
"[[100 10]\n",
" [ 3 8]]\n",
"__updated_array__\n",
"[[100 10 3 4]\n",
" [ 3 8 18 3]\n",
" [ 10 19 9 15]\n",
" [ 9 2 7 3]]\n",
"__Z__\n",
"[[ 100 10]\n",
" [ 3 -9999]]\n",
"Z share memory with array: False\n",
"__original_array__\n",
"[[100 10 3 4]\n",
" [ 3 8 18 3]\n",
" [ 10 19 9 15]\n",
" [ 9 2 7 3]]\n"
]
}
],
"source": [
"# View vs copy of slice of an array\n",
"array = np.random.randint(20, size=(4,4))\n",
"print(\"__array__\")\n",
"print(array)\n",
"\n",
"# Create a new subset of an array\n",
"X = array[:2,:2] # This is only a view. Array X does not exists in the memory, it is reference to array\n",
"print(\"__X__\")\n",
"print(X)\n",
"print(\"X share memory with array: \", np.shares_memory(X, array))\n",
"\n",
"# Changing value of X does change the origianl array as well\n",
"X[0,0] = 100\n",
"print(\"__updated_X__\")\n",
"print(X)\n",
"\n",
"print(\"__updated_array__\")\n",
"print(array)\n",
"\n",
"# To make sure original array does not change then make a copy\n",
"Z = array[:2,:2].copy()\n",
"Z[1,1] = -9999\n",
"print(\"__Z__\")\n",
"print(Z)\n",
"print(\"Z share memory with array: \", np.shares_memory(Z, array))\n",
"\n",
"print(\"__original_array__\")\n",
"print(array) # The index [1,1] did not change to -9999\n"
]
},
{
"cell_type": "markdown",
"id": "6baa55ea",
"metadata": {},
"source": [
"### Shape Manipulation"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "24d76211",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"__array__\n",
"[ 3 10 22 7 2 28 20 16 21 15 3 17 14 25 13 29 25 0 1 21 27 5 29 4\n",
" 19 2 28 18 11 5]\n",
"Array shape: (30,)\n",
"__reshape_1__\n",
"[[ 3 10 22 7 2]\n",
" [28 20 16 21 15]\n",
" [ 3 17 14 25 13]\n",
" [29 25 0 1 21]\n",
" [27 5 29 4 19]\n",
" [ 2 28 18 11 5]]\n",
"__reshape_2__\n",
"[[ 3 10 22 7 2 28]\n",
" [20 16 21 15 3 17]\n",
" [14 25 13 29 25 0]\n",
" [ 1 21 27 5 29 4]\n",
" [19 2 28 18 11 5]]\n",
"__reshape_3__\n",
"[[ 3 28 3 29 27 2]\n",
" [10 20 17 25 5 28]\n",
" [22 16 14 0 29 18]\n",
" [ 7 21 25 1 4 11]\n",
" [ 2 15 13 21 19 5]]\n",
"(5, 6)\n",
"__resize__\n",
"[[ 3 10 22 7 2 28 20 16 21 15]\n",
" [ 3 17 14 25 13 29 25 0 1 21]\n",
" [27 5 29 4 19 2 28 18 11 5]]\n"
]
}
],
"source": [
"array = np.random.randint(30, size=30)\n",
"print(\"__array__\")\n",
"print(array)\n",
"print(\"Array shape: \", array.shape)\n",
"\n",
"print(\"__reshape_1__\")\n",
"print(array.reshape(6,5)) # Change shape to 6 rows and 5 column. This is just a view.\n",
"array = array.reshape(6,5) # This will change the shape of original array\n",
"\n",
"print(\"__reshape_2__\")\n",
"print(array.reshape(5,-1)) # Set a dimension to -1 will calculate that dimension automatically: (5,6) \n",
"\n",
"print(\"__reshape_3__\")\n",
"print(array.T) # Transpose replace row and column order\n",
"print(array.T.shape)\n",
"\n",
"print(\"__resize__\")\n",
"array.resize(3,10) # Resize will reshape the array permanently (in-place). Resize does not accpet -1 as shape\n",
"print(array)\n"
]
},
{
"cell_type": "markdown",
"id": "c660362c",
"metadata": {},
"source": [
"### Stacking and Splitting"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "e963c242",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"__A__\n",
"[[3. 7.]\n",
" [3. 4.]]\n",
"__B__\n",
"[[1. 4.]\n",
" [2. 2.]]\n",
"__vstack__\n",
"[[3. 7.]\n",
" [3. 4.]\n",
" [1. 4.]\n",
" [2. 2.]]\n",
"__hstack__\n",
"[[3. 7. 1. 4.]\n",
" [3. 4. 2. 2.]]\n",
"__concatenate__\n",
"[[3. 7.]\n",
" [3. 4.]\n",
" [1. 4.]\n",
" [2. 2.]]\n",
"__concatenate__\n",
"[[3. 7. 1. 4.]\n",
" [3. 4. 2. 2.]]\n"
]
}
],
"source": [
"A = np.floor(10 * random_generator.random((2,2)))\n",
"B = np.floor(10 * random_generator.random((2,2)))\n",
"print(\"__A__\")\n",
"print(A)\n",
"print(\"__B__\")\n",
"print(B)\n",
"\n",
"# Split an array into multiple sub-arrays vertically (row-wise)\n",
"print(\"__vstack__\")\n",
"print(np.vstack((A, B)))\n",
"\n",
"# Split an array into multiple sub-arrays horizontally (column-wise)\n",
"print(\"__hstack__\")\n",
"print(np.hstack((A, B)))\n",
"\n",
"# Use concatenate to join a sequence of arrays along an existing axis, good for 3D and above\n",
"print(\"__concatenate__\")\n",
"print(np.concatenate((A,B), axis=0)) # same as vstack in this case\n",
"\n",
"print(\"__concatenate__\")\n",
"print(np.concatenate((A,B), axis=1)) # same as hstack in this case\n"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "ee2be3a0",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"__array__\n",
"[[7. 2. 4. 9. 9. 7. 5. 2. 1. 9. 5. 1.]\n",
" [6. 7. 6. 9. 0. 5. 4. 0. 6. 8. 5. 2.]\n",
" [8. 5. 5. 7. 1. 8. 6. 7. 1. 8. 1. 0.]\n",
" [8. 8. 8. 4. 2. 0. 6. 7. 8. 2. 2. 6.]]\n",
"__vsplit_1__\n",
"[array([[7., 2., 4., 9., 9., 7., 5., 2., 1., 9., 5., 1.],\n",
" [6., 7., 6., 9., 0., 5., 4., 0., 6., 8., 5., 2.]]), array([[8., 5., 5., 7., 1., 8., 6., 7., 1., 8., 1., 0.],\n",
" [8., 8., 8., 4., 2., 0., 6., 7., 8., 2., 2., 6.]])]\n",
"__vsplit_2__\n",
"[array([[7., 2., 4., 9., 9., 7., 5., 2., 1., 9., 5., 1.]]), array([[6., 7., 6., 9., 0., 5., 4., 0., 6., 8., 5., 2.]]), array([[8., 5., 5., 7., 1., 8., 6., 7., 1., 8., 1., 0.]]), array([[8., 8., 8., 4., 2., 0., 6., 7., 8., 2., 2., 6.]])]\n",
"__vsplit_3__\n",
"[array([[7., 2., 4., 9., 9., 7., 5., 2., 1., 9., 5., 1.]]), array([[6., 7., 6., 9., 0., 5., 4., 0., 6., 8., 5., 2.]]), array([[8., 5., 5., 7., 1., 8., 6., 7., 1., 8., 1., 0.],\n",
" [8., 8., 8., 4., 2., 0., 6., 7., 8., 2., 2., 6.]])]\n",
"__hsplit_1__\n",
"[array([[7., 2., 4.],\n",
" [6., 7., 6.],\n",
" [8., 5., 5.],\n",
" [8., 8., 8.]]), array([[9., 9.],\n",
" [9., 0.],\n",
" [7., 1.],\n",
" [4., 2.]]), array([[7., 5., 2., 1., 9., 5., 1.],\n",
" [5., 4., 0., 6., 8., 5., 2.],\n",
" [8., 6., 7., 1., 8., 1., 0.],\n",
" [0., 6., 7., 8., 2., 2., 6.]])]\n",
"__array_spit_row__\n",
"[array([[7., 2., 4., 9., 9., 7., 5., 2., 1., 9., 5., 1.],\n",
" [6., 7., 6., 9., 0., 5., 4., 0., 6., 8., 5., 2.]]), array([[8., 5., 5., 7., 1., 8., 6., 7., 1., 8., 1., 0.]]), array([[8., 8., 8., 4., 2., 0., 6., 7., 8., 2., 2., 6.]])]\n",
"__array_spit_col__\n",
"[array([[7., 2., 4., 9.],\n",
" [6., 7., 6., 9.],\n",
" [8., 5., 5., 7.],\n",
" [8., 8., 8., 4.]]), array([[9., 7., 5., 2.],\n",
" [0., 5., 4., 0.],\n",
" [1., 8., 6., 7.],\n",
" [2., 0., 6., 7.]]), array([[1., 9., 5., 1.],\n",
" [6., 8., 5., 2.],\n",
" [1., 8., 1., 0.],\n",
" [8., 2., 2., 6.]])]\n"
]
}
],
"source": [
"array = np.floor(10 * random_generator.random((4,12)))\n",
"print('__array__')\n",
"print(array)\n",
"\n",
"print(\"__vsplit_1__\")\n",
"print(np.vsplit(array, 2)) # split to two arrays by rows\n",
"# cannot split by 3 because array split does not result in an equal division\n",
"# cannot split by 5 because only has 4 rows\n",
"print(\"__vsplit_2__\")\n",
"print(np.vsplit(array, 4)) # split to four arrays by rows, each row is new array\n",
"\n",
"print(\"__vsplit_3__\")\n",
"print(np.vsplit(array, (1,2))) # split by row 1, by row 2 and rest of rows. Total three arrays\n",
"\n",
"print(\"__hsplit_1__\")\n",
"print(np.hsplit(array, (3,5))) # split by col 3, by col 5 and rest of cols. Total three arrays\n",
"\n",
"# np.array_split to split an array into multiple sub-arrays.\n",
"print(\"__array_spit_row__\")\n",
"print(np.array_split(array, 3, axis=0))\n",
"\n",
"print(\"__array_spit_col__\")\n",
"print(np.array_split(array, 3, axis=1))\n"
]
},
{
"cell_type": "markdown",
"id": "292cf921",
"metadata": {},
"source": [
"### Sorting an array"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "74b70c04",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"__array__\n",
"[[5 2 9 1]\n",
" [7 1 1 1]\n",
" [1 7 3 9]\n",
" [6 7 6 6]]\n",
"__sort_1__\n",
"[[1 2 5 9]\n",
" [1 1 1 7]\n",
" [1 3 7 9]\n",
" [6 6 6 7]]\n",
"__sorted_array\n",
"[[1 2 5 9]\n",
" [1 1 1 7]\n",
" [1 3 7 9]\n",
" [6 6 6 7]]\n",
"CPU times: user 13 µs, sys: 6 µs, total: 19 µs\n",
"Wall time: 18.1 µs\n",
"CPU times: user 5 µs, sys: 3 µs, total: 8 µs\n",
"Wall time: 10 µs\n"
]
}
],
"source": [
"array = np.random.randint(10, size=(4,4))\n",
"print('__array__')\n",
"print(array)\n",
"\n",
"print(\"__sort_1__\")\n",
"print(np.sort(array)) # temporary sort, just a view of sorted array \n",
"\n",
"array.sort()\n",
"print(\"__sorted_array\")\n",
"print(array) # in-place sort, it changes the original array\n",
"\n",
"array = np.random.randint(10, size=(4,4))\n",
"%time np.sort(array) # slower\n",
"%time array.sort() # faster"
]
},
{
"cell_type": "code",
"execution_count": 43,
"id": "b2ed6d1f",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"__sort_ascending__\n",
"['Jack' 'Mark' 'Sarah' 'David' 'Rose']\n",
"__sort_descending__\n",
"['Rose' 'David' 'Sarah' 'Mark' 'Jack']\n",
"['Rose' 'David' 'Sarah' 'Mark' 'Jack']\n"
]
}
],
"source": [
"# Argsort returns the indices that would sort an array, not the sorted array\n",
"\n",
"scores = np.array([1, 3, 64, 100, 23])\n",
"names = np.array([\"Jack\", \"Mark\", \"David\", \"Rose\", \"Sarah\"])\n",
"\n",
"# Sort names by their scores\n",
"print(\"__sort_ascending__\")\n",
"print(names[np.argsort(scores)])\n",
"\n",
"print(\"__sort_descending__\")\n",
"print(names[np.argsort(~scores)]) # ~ is Negation\n",
"print(names[np.argsort(scores)][::-1]) # this is same as line above\n"
]
},
{
"cell_type": "markdown",
"id": "6edbc54f",
"metadata": {},
"source": [
"### Filtering and searching"
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "cc21ee89",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"__array__\n",
"[[1 2 3]\n",
" [3 0 4]\n",
" [0 6 5]]\n",
"__where_1__\n",
"(array([2, 2]), array([1, 2]))\n",
"[6 5]\n",
"[6 5]\n",
"__where_2__\n",
"[[-1 -1 -1]\n",
" [-1 -1 -1]\n",
" [-1 6 5]]\n",
"__where_3__\n",
"[[False False False]\n",
" [False False False]\n",
" [False True True]]\n"
]
}
],
"source": [
"# The function numpy.where can be used to take a boolean-valued array, \n",
"# and produce the tuple of index-arrays that access the True entries of that array, via integer array indexing\n",
"\n",
"array = np.array([[1,2,3],\n",
" [3,0,4], \n",
" [0,6,5]])\n",
"print(\"__array__\")\n",
"print(array)\n",
"\n",
"print(\"__where_1__\")\n",
"print(np.where(array>4)) # Returns indicies that meet the condition given\n",
"print(array[np.where(array>4)]) # Filter array using output of np.where\n",
"print(array[array>4]) # This is same as line above\n",
"\n",
"print(\"__where_2__\")\n",
"print(np.where(array>4, array, -1)) # Any element more than 4 keep it, otherwise replace with -1\n",
"\n",
"print(\"__where_3__\")\n",
"print(np.where(array>4, True, False)) # Any element more than 4 is True, otherwise is False\n"
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "d92a8a6d",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"__array__\n",
"[[2 2 3]\n",
" [2 0 4]\n",
" [4 6 5]]\n",
"__any_1__\n",
"True\n",
"__any_row__\n",
"[ True True True]\n",
"__any_col__\n",
"[False True True]\n",
"__all_1__\n",
"False\n",
"__all_row__\n",
"[ True False True]\n",
"__all_col__\n",
"[False False True]\n"
]
}
],
"source": [
"array = np.array([[2,2,3],\n",
" [2,0,4], \n",
" [4,6,5]])\n",
"\n",
"print(\"__array__\")\n",
"print(array)\n",
"\n",
"print(\"__any_1__\")\n",
"print(np.any(array>3)) # If any element in array has value more than 3\n",
"\n",
"print(\"__any_row__\")\n",
"print(np.any(array>3, axis=0)) # If any row has value more than 3\n",
"\n",
"print(\"__any_col__\")\n",
"print(np.any(array>3, axis=1)) # If any col has value more than 3\n",
"\n",
"\n",
"print(\"__all_1__\")\n",
"print(np.all(array>3)) # If all element in array has value more than 3\n",
"\n",
"print(\"__all_row__\")\n",
"print(np.all(array>1, axis=0)) # If all row has value more than 1\n",
"\n",
"print(\"__all_col__\")\n",
"print(np.all(array>3, axis=1)) # If all col has value more than 3\n"
]
},
{
"cell_type": "code",
"execution_count": 44,
"id": "327600b7",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"__array__\n",
"[[ 2 2 3]\n",
" [ 2 0 -4]\n",
" [ 4 -6 5]]\n",
"__condition_1__\n",
"[[ True True True]\n",
" [ True False False]\n",
" [False False False]]\n",
"[2 2 3 2]\n",
"__condition_2__\n",
"[[ True True True]\n",
" [ True False False]\n",
" [ True False True]]\n",
"__condition_3__\n",
"[-4 -6]\n"
]
}
],
"source": [
"array = np.array([[2,2,3],\n",
" [2,0,-4], \n",
" [4,-6,5]])\n",
"\n",
"print(\"__array__\")\n",
"print(array)\n",
"\n",
"print(\"__condition_1__\")\n",
"print( (array > 1) & (array < 4)) # Only returns boolean based on the conditions (AND)\n",
"print(array[(array > 1) & (array < 4)])\n",
"\n",
"print(\"__condition_2__\")\n",
"print( (array > 2) | (array > 1)) # Only returns boolean based on the conditions (OR)\n",
"\n",
"print(\"__condition_3__\")\n",
"print(array[array<0]) # Filter negative elements\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 27,
"id": "010d7bdd",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"__array__\n",
"[0.033333 0.034333 0.035333 0.036333 0.037333 0.038333 0.039333 0.040333\n",
" 0.041333 0.042333 0.043333 0.044333 0.045333 0.046333 0.047333 0.048333\n",
" 0.049333 0.050333 0.051333 0.052333 0.053333 0.054333 0.055333 0.056333\n",
" 0.057333 0.058333 0.059333 0.060333 0.061333 0.062333 0.063333 0.064333\n",
" 0.065333 0.066333 0.067333 0.068333 0.069333 0.070333 0.071333 0.072333\n",
" 0.073333 0.074333 0.075333 0.076333 0.077333 0.078333 0.079333 0.080333\n",
" 0.081333 0.082333 0.083333 0.084333 0.085333 0.086333 0.087333 0.088333\n",
" 0.089333 0.090333 0.091333 0.092333 0.093333 0.094333 0.095333 0.096333\n",
" 0.097333 0.098333 0.099333 0.100333 0.101333 0.102333 0.103333 0.104333\n",
" 0.105333 0.106333 0.107333 0.108333 0.109333 0.110333]\n",
"__filtering_float__\n",
"[]\n",
"__filtering_float_isclose__\n",
"[0.033333 0.084333]\n"
]
}
],
"source": [
"array = np.arange(.033333, 0.111133, .001)\n",
"print(\"__array__\")\n",
"print(array)\n",
"\n",
"# If use filter by exact match for float, there is no match \n",
"print(\"__filtering_float__\")\n",
"print(array[(array==0.03) | (array==.054)])\n",
"\n",
"print(\"__filtering_float_isclose__\")\n",
"# np.isclose returns a boolean array where two arrays are element-wise equal within a tolerance.\n",
"print(array[(np.isclose(array, 0.03333, rtol=0.0001)) | (np.isclose(array, 0.08433, rtol=0.0001))])\n"
]
},
{
"cell_type": "markdown",
"id": "85613bd4",
"metadata": {},
"source": [
"### Stride Tricks\n",
"The stride tricks API can be seen as an extension of the usual way of accessing and manipulating NumPy ndarray’s, giving users more flexibility to control the resulting NumPy view.\n",
"\n",
"Striding is like taking steps in your data with a window of a fixed size.\n",
"\n",
"For more information on stride tricks I recommend check this blog: https://medium.com/analytics-vidhya/a-thorough-understanding-of-numpy-strides-and-its-application-in-data-processing-e40eab1c82fe\n"
]
},
{
"cell_type": "code",
"execution_count": 28,
"id": "ade644ed",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"__array__\n",
"[0 1 2 3 4 5 6 7]\n",
"__array_data_type__\n",
"int32\n",
"__stride__\n",
"(4,)\n"
]
}
],
"source": [
"array = np.arange(8, dtype=np.int32)\n",
"print('__array__')\n",
"print(array)\n",
"window = 2\n",
"\n",
"print(\"__array_data_type__\")\n",
"print(array.dtype) # int32\n",
"\n",
"# To get the stride\n",
"print(\"__stride__\")\n",
"print(array.strides) # 32/8 = 8 bytes\n"
]
},
{
"cell_type": "code",
"execution_count": 29,
"id": "f3e0e353",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[0, 1],\n",
" [3, 4],\n",
" [6, 7]], dtype=int32)"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# np.lib.stride_tricks.as_strided ( Arr, New_arr_shape, Stride_steps )\n",
"# Arr: orignal array that need to be stride on\n",
"# New_arr_shape: Shape of output array\n",
"# Stride_steps: Stride size measured in byte\n",
"\n",
"np.lib.stride_tricks.as_strided(array,shape=((len(array)-window)//3+1,window), strides=(3*4,4))"
]
},
{
"cell_type": "markdown",
"id": "c2dc5a7f",
"metadata": {},
"source": [
"### Convolution"
]
},
{
"cell_type": "code",
"execution_count": 30,
"id": "aaca8487",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"__A__\n",
"[1 2 3 4 5]\n",
"__moving_average__\n",
"[1.5 2.5 3.5 4.5]\n",
"__moving_sum__\n",
"[3. 5. 7. 9.]\n"
]
}
],
"source": [
"# np.convolve can be used to calculate moving average and moving sum\n",
"A = np.array([1,2,3,4,5])\n",
"print(\"__A__\")\n",
"print(A)\n",
"\n",
"# Set a window value\n",
"window = 2\n",
"W = np.repeat(1.0, window)/window\n",
"print(\"__moving_average__\")\n",
"print(np.convolve(A, W, mode=\"valid\")) # Set mode to valid to ignore first and last 2 elements\n",
"\n",
"print(\"__moving_sum__\")\n",
"W = np.repeat(1.0, window)\n",
"print(np.convolve(A, W, \"valid\"))\n"
]
},
{
"cell_type": "markdown",
"id": "da29a353",
"metadata": {},
"source": [
"### Einsum\n",
"\n",
"Evaluates the Einstein summation convention on the operands.\n",
"\n",
"Using the Einstein summation convention, many common multi-dimensional, linear algebraic array operations can be represented in a simple fashion."
]
},
{
"cell_type": "code",
"execution_count": 45,
"id": "393a7bfa",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"__view__\n",
"[[1 2 3]\n",
" [3 5 2]\n",
" [8 4 2]]\n",
"__transpose__\n",
"[[1 3 8]\n",
" [2 5 4]\n",
" [3 2 2]]\n",
"__dot__\n",
"[[ 7 1 11]\n",
" [12 3 18]\n",
" [10 8 32]]\n",
"__sum_over_row__\n",
"[ 6 10 14]\n",
"__sum_over_col__\n",
"[12 11 7]\n",
"__diag__\n",
"[1 5 2]\n"
]
}
],
"source": [
"A = np.array([[1,2,3],\n",
" [3,5,2],\n",
" [8,4,2]])\n",
"\n",
"B = np.array([[0,1,3],\n",
" [2,0,1],\n",
" [1,0,2]])\n",
"\n",
"\n",
"# string format: input shape -> output shape\n",
"# When you leave a dimension out of output, Einsum applies sum along that dimension\n",
"\n",
"print(\"__view__\")\n",
"print(np.einsum('ij -> ij', A)) # return same, .view()\n",
"\n",
"print(\"__transpose__\")\n",
"print(np.einsum('ij -> ji', A)) # same as a.T\n",
"\n",
"print(\"__dot__\")\n",
"print(np.einsum('ij, jk -> ik', A, B)) # same as a @ b\n",
" \n",
"print(\"__sum_over_row__\")\n",
"print(np.einsum('ij -> i', A)) # left out j, means sum around dim j\n",
"\n",
"print(\"__sum_over_col__\")\n",
"print(np.einsum('ij -> j', A)) # left out i, means sum around dim i\n",
"\n",
"print(\"__diag__\")\n",
"print(np.einsum('ii -> i', A)) # same as np.diag(a)\n"
]
},
{
"cell_type": "markdown",
"id": "69c5f914",
"metadata": {},
"source": [
"# Signal Processing with NumPy"
]
},
{
"cell_type": "code",
"execution_count": 32,
"id": "a69bce78",
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "markdown",
"id": "b989ad97",
"metadata": {},
"source": [
"## Hamming signal using Convolve"
]
},
{
"cell_type": "code",
"execution_count": 46,
"id": "c22b5727",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA2oAAADCCAYAAAA4jDEVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAYeklEQVR4nO3df4zk933X8ed7Z2fOM+fUbnvXKPjucq56/XFEpYlWrqsgapKgnkPkQ6IUW62ShtADqYbQhoBNkFuM+CMEtVDVDZgmpI3auK4x5QSXulVqVEDY9bkGE9t1OTmJ7440vjqJqW7GN7Ozb/6Y7+yO13ferW/m5jv7eT6kk/f7na9339J3v7vz2s/n8/5EZiJJkiRJqo+leRcgSZIkSXolg5okSZIk1YxBTZIkSZJqxqAmSZIkSTVjUJMkSZKkmjGoSZIkSVLNLM/rC+/ZsycPHjw4ry8vSZIkSXP1+OOP/3Fm7r3Ya3MLagcPHuTkyZPz+vKSJEmSNFcR8aVLvebUR0mSJEmqGYOaJEmSJNXMlkEtIj4ZES9ExOcv8XpExM9FxKmIeDIi3jb9MiVJkiSpHNsZUfsUcOQ1Xr8ZOFT9OwZ8/PLLkiRJkqRybdlMJDN/NyIOvsYlR4FfzswEHomIayPiTZn55SnVKEmasU8/8iWePP31eZehGXvTtW1+4l2HiIh5lyJJ2sI0uj5eB5yeOD5TnXtVUIuIY4xG3Thw4MAUvrQkaRo+9pt/wHAtuabdnHcpmpHz/SEv9Qa89/vezJ6rd827HEnSFq5oe/7MvBe4F2BlZSWv5NeWJF1atz/kb33/t/LhH/jOeZeiGfn1k6f58ANP0usP512KJGkbptH18Sywf+J4X3VOkrQA+qtrrK4lndbcttbUFTC+v12DmiQthGkEtePAe6vujzcCL7k+TZIWR7e/CkC72ZhzJZqlTmt0f89X91uSVG9b/vk0Ij4D3ATsiYgzwE8BTYDM/NfACeDdwCmgC7x/VsVKkqZvPMIyfiOvnald3V+nPkrSYthO18fbtng9gR+fWkWSpCtqHNTaBrUdbRzEnfooSYthGlMfJUkLrLc+ouYatZ1sI6g59VGSFoFBTZIKN37j7tTHna1dBXGnPkrSYjCoSVLhugOnPpag03TqoyQtEoOaJBWuZzORIqw3ExkY1CRpERjUJKlw610fm65R28l2LS+xFK5Rk6RFYVCTpML1xvuoOaK2o0UEndayUx8laUEY1CSpcO6jVo52q2EzEUlaEAY1SSrc+j5qTYPaTtdpNRxRk6QFYVCTpML1BkOuai6xtBTzLkUz1m4a1CRpURjUJKlw3f6qm10XotNq0BvYTESSFoFBTZIK1+0PnfZYCJuJSNLiMKhJUuF6/aGNRAphMxFJWhwGNUkqXLc/pLPLqY8l2G0zEUlaGAY1SSpcrz+k49THIrSd+ihJC8OgJkmF6w5WnfpYiE6rsb7BuSSp3gxqklS4bn9I26BWhE6rQXcwJDPnXYokaQsGNUkqnM1EytFuNciEC6tr8y5FkrQFg5okFa7bH7qPWiHGaxFdpyZJ9WdQk6TC9Zz6WIxxIO+6Tk2Sas+gJkkFWx2u0R+u2fWxEONA7l5qklR/2wpqEXEkIp6NiFMRccdFXj8QEQ9HxBMR8WREvHv6pUqSpq07GL1hd0StDOO1iE59lKT62zKoRUQDuAe4GTgM3BYRhzdd9o+B+zPzrcCtwC9Mu1BJ0vSNR1Zco1aGtkFNkhbGdkbUbgBOZeZzmdkH7gOObromgW+oPr4G+L/TK1GSNCvnL4zWKtn1sQyuUZOkxbGdP6FeB5yeOD4DfO+ma34a+K2I+DvAbuBdU6lOkjRT45EVpz6WwamPkrQ4ptVM5DbgU5m5D3g38OmIeNXnjohjEXEyIk6eO3duSl9akvR69QbjqY8GtRK0mzYTkaRFsZ2gdhbYP3G8rzo36QPA/QCZ+T+Aq4A9mz9RZt6bmSuZubJ3797XV7EkaWq6fYNaSTZG1Jz6KEl1t52g9hhwKCKuj4gWo2Yhxzdd8zzwToCI+C5GQc0hM0mquV71hr3dtJlICdbXqA0cUZOkutsyqGXmKnA78BDwDKPujk9FxN0RcUt12YeAH4uI/wV8BvjRzMxZFS1Jmg5H1MpyVXOJCKc+StIi2NafUDPzBHBi07m7Jj5+Gnj7dEuTJM2aQa0sEUG72bCZiCQtgGk1E5EkLaCeXR+L02kZ1CRpERjUJKlgXTe8Lk671VhfmyhJqi+DmiQVrDtYpbW8RGMp5l2KrpBOc9kRNUlaAAY1SSpYrz90fVph2q3G+v55kqT6MqhJUsG6/SGdpkGtJK5Rk6TFYFCTpIL1+kMbiRTGoCZJi8GgJkkF6/ZXbSRSmHZr2WYikrQADGqSVLCua9SKs9sRNUlaCAY1SSpYb2BQK82oPb9BTZLqzqAmSQUbjag59bEknVaD7mBIZs67FEnSazCoSVLBbCZSnk5rmeFa0h+uzbsUSdJrMKhJUsFGzUQMaiVpV9sxOP1RkurNoCZJBes6olaccTC3oYgk1ZtBTZIKNVxLLqyu0Wm6Rq0kbYOaJC0Eg5okFao3GL1Rd+pjWcbNY5z6KEn1ZlCTpEJ1q02PnfpYlo2pj256LUl1ZlCTpEKNR1QcUSvL+tTHgSNqklRnBjVJKtT5Cwa1Eq2PqF0wqElSnRnUJKlQvcF46qPNREoybh7j1EdJqjeDmiQVquvUxyKNpz72nPooSbVmUJOkQo2D2ngDZJXBfdQkaTFsK6hFxJGIeDYiTkXEHZe45oci4umIeCoifnW6ZUqSps1mImUaB3ODmiTV25YLEyKiAdwD/CXgDPBYRBzPzKcnrjkE3Am8PTO/FhHfMquCJUnTsTH10TVqJVlaCq5qLtFzjZok1dp2RtRuAE5l5nOZ2QfuA45uuubHgHsy82sAmfnCdMuUJE2b+6iVq9NadkRNkmpuO0HtOuD0xPGZ6tykbwe+PSL+e0Q8EhFHLvaJIuJYRJyMiJPnzp17fRVLkqbCqY/lajcb6/dfklRP02omsgwcAm4CbgP+bURcu/mizLw3M1cyc2Xv3r1T+tKSpNejOxjSbATNhn2lStNpNRxRk6Sa285v57PA/onjfdW5SWeA45k5yMwvAH/IKLhJkmqq1x/a8bFQnVaDru35JanWthPUHgMORcT1EdECbgWOb7rmNxiNphERexhNhXxuinVKkqas21+1kUih2q2GzUQkqea2DGqZuQrcDjwEPAPcn5lPRcTdEXFLddlDwIsR8TTwMPDhzHxxVkVLki5ftz90fVqhbCYiSfW3rT+lZuYJ4MSmc3dNfJzAT1b/JEkLoNcf2vGxUKMRNYOaJNWZK8glqVCOqJWr07SZiCTVnUFNkgrVHQxdo1ao3buW1/fRkyTVk0FNkgrV6686olaodqtBz66PklRrBjVJKlTXNWrF6jQbDIbJYLg271IkSZdgUJOkQvVco1ascUB3nZok1ZdBTZIKNWom4hq1Eo3vu50fJam+DGqSVKC1taQ3GNJuOqJWos76iJoNRSSprgxqklSgl1dHIylOfSyTUx8lqf4MapJUoPEbdINamcb33c6PklRfBjVJKtB4bVLbNWpF6jiiJkm1Z1CTpAI5ola2dnPcTMQ1apJUVwY1SSrQ+eoNuvuolWkc0M9fcERNkurKoCZJBRpPfezY9bFI61MfXaMmSbVlUJOkAm1MfXSNWonGI6lOfZSk+jKoSVKBuk59LNo4oNtMRJLqy6AmSQXq2UykaI2loLW8tP59IEmqH4OaJBXIro/qtBqOqElSjRnUJKlA442OnfpYrk7ToCZJdWZQk6QCdfuro+lvDX8NlKrdatAb2ExEkurK39CSVKBuf0in2SAi5l2K5qTTWnZETZJqzKAmSQXq9YdOeyxc2zVqklRr2wpqEXEkIp6NiFMRccdrXPdXIyIjYmV6JUqSpq3bH9pIpHCdVsOuj5JUY1sGtYhoAPcANwOHgdsi4vBFrnsD8EHg0WkXKUmarm5/SNvNros26vroGjVJqqvtjKjdAJzKzOcysw/cBxy9yHX/FPgo8PIU65MkzUBvsOqIWuHazWVH1CSpxrYT1K4DTk8cn6nOrYuItwH7M/M/v9YniohjEXEyIk6eO3fuT12sJGk6nPqoTqtBd2BQk6S6uuxmIhGxBPwM8KGtrs3MezNzJTNX9u7de7lfWpL0OvUMasXr7LKZiCTV2XaC2llg/8Txvurc2BuAtwD/JSK+CNwIHLehiCTV12hEzTVqJes0l+mvrjFcy3mXIkm6iO0EtceAQxFxfUS0gFuB4+MXM/OlzNyTmQcz8yDwCHBLZp6cScWSpMvWtT1/8cYjqjYUkaR62jKoZeYqcDvwEPAMcH9mPhURd0fELbMuUJI0fb3+Kp2mQa1k46BuQxFJqqdtzXvJzBPAiU3n7rrEtTddflmSpFnJTLoD16iVbmNEzaAmSXV02c1EJEmL5cLqGpm4j1rhDGqSVG8GNUkqzPiNuSNqZRsH9d7ANWqSVEcGNUkqzLh5hM1EyuaImiTVm0FNkgrTc0RNQLtpUJOkOjOoSVJhnPoo2Lj/dn2UpHoyqElSYc6Ppz42bSZSsvGG5+fdR02SasmgJkmFceqjwH3UJKnuDGqSVBinPgpsJiJJdWdQk6TCjEdQ7PpYtmZjiWYjDGqSVFMGNUkqzLg9f8cNr4vXbjbouUZNkmrJoCZJhekOnPqokU5r2RE1Saopg5okFabXHxIBu5b9FVC6TquxHtwlSfXib2lJKky3P6TTbBAR8y5Fc9ZuNez6KEk1ZVCTpMJ0+0Park8T1Yiaa9QkqZYMapJUmF5/1fVpAqDdWnZETZJqyqAmSYXp9ocGNQHQaTZsJiJJNWVQk6TC9AZD91ATMJ76aFCTpDoyqElSYRxR01i71aBn10dJqiWDmiQVptsf0m7aTEQ2E5GkOjOoSVJhev1Vdu9yRE2jDa9fHqyxtpbzLkWStMm2glpEHImIZyPiVETccZHXfzIino6IJyPicxHx5umXKkmaBqc+amz8feD0R0mqny2DWkQ0gHuAm4HDwG0RcXjTZU8AK5n53cADwD+fdqGSpOnoOfVRlXFQs6GIJNXPdkbUbgBOZeZzmdkH7gOOTl6QmQ9nZrc6fATYN90yJUnTkJl0B46oaWS88bl7qUlS/WwnqF0HnJ44PlOdu5QPAJ+9nKIkSbPRH64xXEvb8wuYGFEb2FBEkupmqnNfIuJHgBXg+y/x+jHgGMCBAwem+aUlSdswHjlxRE3AemB36qMk1c92RtTOAvsnjvdV514hIt4FfAS4JTMvXOwTZea9mbmSmSt79+59PfVKki5D16CmCZ1m1UzEoCZJtbOdoPYYcCgiro+IFnArcHzygoh4K/BvGIW0F6ZfpiRpGsZBbbw2SWXrVN8HjqhJUv1sGdQycxW4HXgIeAa4PzOfioi7I+KW6rKPAVcDvx4R/zMijl/i00mS5mh96mPTETVNTn10jZok1c22/qSamSeAE5vO3TXx8bumXJckaQbGb8id+iiY2EfNETVJqp1tbXgtSdoZNqY+GtS0EdTOG9QkqXYMapJUkI1mIq5R00Zg7zn1UZJqx6AmSQVx6qMmtRpLNJbCZiKSVEMGNUkqSG/g1EdtiAg6zYZBTZJqyKAmSQVxHzVt1m41bCYiSTVkUJOkgoyD2lXLBjWNdFoNugODmiTVjUFNkgrS66/SbjZYWop5l6KaaLeWbSYiSTVkUJOkgnT7Q6c96hU6LdeoSVIdGdQkqSC9/tBGInoFg5ok1ZNBTZIK4oiaNms3bSYiSXVkUJOkgnQHQ9pudq0Jo2YirlGTpLoxqElSQXr9VTpNR9S0YdRMxBE1Saobg5okFcSpj9rMNWqSVE8GNUkqiM1EtFmn1aA3GJKZ8y5FkjTBoCZJBen2h+x2jZomdFrLZMLLg7V5lyJJmmBQk6SCdPurjqjpFcZTYbtuei1JtWJQk6SC9AauUdMrtdeDmuvUJKlODGqSVIjBcI3BMA1qeoXx90NvYFCTpDoxqElSIcYjJu6jpkkdR9QkqZYMapJUiPFeWY6oaVK7OQrurlGTpHoxqElSIcZvxA1qmrQ+9dERNUmqlW0FtYg4EhHPRsSpiLjjIq/viohfq15/NCIOTrtQSdLlWZ/62DSoaYNTHyWpnrYMahHRAO4BbgYOA7dFxOFNl30A+Fpmfhvws8BHp12oJOnyjJtFdFyjpgltR9QkqZa289v6BuBUZj4HEBH3AUeBpyeuOQr8dPXxA8DPR0RkZk6x1pk7+cWv8vxXu/MuQ5Jm4tmv/AmA+6jpFcbB/ZHnXmS5EXOuRpJm4xt3t/iL3/Et8y7jT2U7Qe064PTE8Rngey91TWauRsRLwDcDfzx5UUQcA44BHDhw4HWWPDu/+nvP8+Dvn513GZI0M0sBb/yGXfMuQzVy9a5l3nDVMg8+cZYHn/B3oKSd6Xv2X7sjg9rUZOa9wL0AKysrtRttu/Pm7+KD7zw07zIkaWZ271pmz9UGNW1oLS/x3/7hO/h6tz/vUiRpZlrLi9dDcTtB7Sywf+J4X3XuYteciYhl4BrgxalUeAXtfcMuwDcwkqSyXNNuck27Oe8yJEkTthMtHwMORcT1EdECbgWOb7rmOPC+6uMfBH5n0danSZIkSVJdbDmiVq05ux14CGgAn8zMpyLibuBkZh4HPgF8OiJOAV9lFOYkSZIkSa/DttaoZeYJ4MSmc3dNfPwy8NemW5okSZIklWnxVtVJkiRJ0g5nUJMkSZKkmol59fyIiHPAl+byxV/bHjbt/6aieP/L5v0vm/e/bN7/snn/yzXve//mzNx7sRfmFtTqKiJOZubKvOvQfHj/y+b9L5v3v2ze/7J5/8tV53vv1EdJkiRJqhmDmiRJkiTVjEHt1e6ddwGaK+9/2bz/ZfP+l837Xzbvf7lqe+9doyZJkiRJNeOImiRJkiTVjEFtQkQciYhnI+JURNwx73o0OxGxPyIejoinI+KpiPhgdf6bIuK3I+L/VP/9xnnXqtmJiEZEPBER/6k6vj4iHq1+BvxaRLTmXaNmIyKujYgHIuIPIuKZiPg+n/9yRMRPVD/7Px8Rn4mIq3z+d66I+GREvBARn584d9HnPUZ+rvo+eDIi3ja/yjUNl7j/H6t+/j8ZEf8hIq6deO3O6v4/GxE/MJ+qRwxqlYhoAPcANwOHgdsi4vB8q9IMrQIfyszDwI3Aj1f3+w7gc5l5CPhcdayd64PAMxPHHwV+NjO/Dfga8IG5VKUr4V8Bv5mZ3wn8OUbfBz7/BYiI64C/C6xk5luABnArPv872aeAI5vOXep5vxk4VP07Bnz8CtWo2fkUr77/vw28JTO/G/hD4E6A6r3grcCfrf6fX6gywlwY1DbcAJzKzOcysw/cBxydc02akcz8cmb+fvXxnzB6k3Ydo3v+S9VlvwT8lflUqFmLiH3AXwZ+sToO4B3AA9Ul3v8dKiKuAf4C8AmAzOxn5tfx+S/JMtCOiGWgA3wZn/8dKzN/F/jqptOXet6PAr+cI48A10bEm65MpZqFi93/zPytzFytDh8B9lUfHwXuy8wLmfkF4BSjjDAXBrUN1wGnJ47PVOe0w0XEQeCtwKPAGzPzy9VLfwS8cU5lafb+JfAPgLXq+JuBr0/84PZnwM51PXAO+HfV1NdfjIjd+PwXITPPAv8CeJ5RQHsJeByf/9Jc6nn3/WB5/gbw2erjWt1/g5qKFhFXA/8e+HuZ+f8mX8tRS1Tbou5AEfEe4IXMfHzetWguloG3AR/PzLcC59k0zdHnf+eq1iIdZRTY/wywm1dPi1JBfN7LFREfYbQc5lfmXcvFGNQ2nAX2Txzvq85ph4qIJqOQ9iuZ+WB1+ivjKQ7Vf1+YV32aqbcDt0TEFxlNc34HozVL11ZTocCfATvZGeBMZj5aHT/AKLj5/JfhXcAXMvNcZg6ABxn9TPD5L8ulnnffDxYiIn4UeA/ww7mxX1mt7r9BbcNjwKGq61OL0ULC43OuSTNSrUf6BPBMZv7MxEvHgfdVH78P+I9XujbNXmbemZn7MvMgo2f9dzLzh4GHgR+sLvP+71CZ+UfA6Yj4jurUO4Gn8fkvxfPAjRHRqX4XjO+/z39ZLvW8HwfeW3V/vBF4aWKKpHaIiDjCaPnDLZnZnXjpOHBrROyKiOsZNZX5vXnUCG54/QoR8W5G61YawCcz85/NuSTNSET8eeC/Av+bjTVK/4jROrX7gQPAl4AfyszNC5C1g0TETcDfz8z3RMS3Mhph+ybgCeBHMvPCPOvTbETE9zBqJNMCngPez+iPlz7/BYiIfwL8dUZTnp4A/iajdSg+/ztQRHwGuAnYA3wF+CngN7jI816F959nNB22C7w/M0/Oo25NxyXu/53ALuDF6rJHMvNvV9d/hNG6tVVGS2M+u/lzXikGNUmSJEmqGac+SpIkSVLNGNQkSZIkqWYMapIkSZJUMwY1SZIkSaoZg5okSZIk1YxBTZIkSZJqxqAmSZIkSTVjUJMkSZKkmvn/oKHDLRIE26QAAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 1080x216 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Generate a simpel signal\n",
"signal = np.concatenate((np.zeros(50), np.ones(20), np.zeros(50)))\n",
"\n",
"fig = plt.figure(figsize=(15,3))\n",
"plt.plot(signal)\n",
"plt.show()\n"
]
},
{
"cell_type": "code",
"execution_count": 50,
"id": "0803d32f",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 1080x216 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"## Hamming Filter\n",
"filter_signal = np.hamming(20)\n",
"\n",
"fig = plt.figure(figsize=(15,3))\n",
"plt.plot(filter_signal)\n",
"plt.show()\n"
]
},
{
"cell_type": "code",
"execution_count": 51,
"id": "0d24d426",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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UFVVRXp6Os888wwxMTHMnj2bsWPHsm7dOi699FK+/vprQkND+fLLLzl48CDPPPMMzz//POvXr2fy5Mk8++yzANx4441s3LiR6upqLr74Yn7zm9+0GtdTTz3Fa6+9xjvvvMPKlSu55557WLx4MVu3bj0m9scffxx/f39efPFFHnroIYYOHcoNN9zAnj17AHjggQeYPn06d999Nzk5OezatYuUlBReeeWVpuMUFhaybNkyysrKcDgcPPbYY8ycOZO0tDQ2bdpEbGwsv/vd73jxxReJi4ujf//+jB8/njvuuIPZs2czefJkVq9eTUlJCU8//TQzZ84kNzeXK6+8ksrKSgAefvjhk0om20OJmohIJ3A0OFmzw9WPZ1XmAarrG+gXFcK1MwawZEyi+vFIt9YvOoTrZg7kupkD2V1cyfLNBby5ZR93/WMr//nmN8wcFMvSsUksGNmPkEANjiPd2Mo7Yf/XHXvMfqNg4b1tFtm5cyevvPIKTz75JN/5znd44403uOKKK7jqqqt46KGHOPvss/n1r3/Nb37zGx544AEA6urqmporXnPNNRw5coT169ezfPlylixZwscff8xTTz3FxIkT2bx5M2PHjuWee+6hd+/eNDQ0MHfuXL766itGjx7dYkzXXXcd69atY/HixVx88cXk5uYeVyYtLY0bbriBiIgI7rjjDgAuu+wybrvtNmbMmMGePXs477zz2LZtGwCZmZmsW7eO0NBja+xffvllzjvvPO666y4aGhqoqqo6Zv/GjRt544032LJlC/X19YwbN47x48c37Xc4HHz22WesWLGC3/zmN6xatYq+ffvy3nvvERISws6dO7n00ktbbN55OpSoiYicQbWOBv7vi308/mEOeYeqiAkL5MJxSSwZk8hEjYwnPdCA2HB+NG8Qt87N4JuCMtfE2lsKWP3qZmLfDuY/ZgzgiikpRIZoUm2RjjJgwADGjh0LwPjx48nNzaW0tJSSkhLOPvtsAK6++mouueSSpucsW7bsmGNccMEFGGMYNWoU8fHxjBo1CoARI0aQm5vL2LFjee2113jiiSdwOBwUFhaSmZnZaqJ2qlatWkVmZmbTellZGRUVrj6wS5YsOS5JA5g4cSLXXnst9fX1fOtb32r6v2j08ccfs3TpUkJCQggJCeGCCy44Zv+FF14IHP2/A6ivr+fmm29m8+bN+Pv7k5WV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\n",
"text/plain": [
"<Figure size 1080x216 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"## Normalize the filter\n",
"norm_filter_signal = np.divide(filter_signal, np.sum(filter_signal))\n",
"\n",
"fig = plt.figure(figsize=(15,3))\n",
"plt.plot(filter_signal, label=\"filter signal\")\n",
"plt.plot(norm_filter_signal, label=\"normal filter signal\")\n",
"plt.legend()\n",
"plt.show()\n"
]
},
{
"cell_type": "code",
"execution_count": 52,
"id": "2aef400a",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 1080x216 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"### Convolve\n",
"convolved_signal = np.convolve(signal, norm_filter_signal)\n",
"\n",
"fig = plt.figure(figsize=(15,3))\n",
"plt.plot(convolved_signal)\n",
"plt.show()\n"
]
},
{
"cell_type": "markdown",
"id": "47f20f17",
"metadata": {},
"source": [
"## Fast Fourier transform (FFT)"
]
},
{
"cell_type": "code",
"execution_count": 53,
"id": "8513b306",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 1080x216 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Generate random signal\n",
"random_signal = np.random.randn(200)\n",
"\n",
"fig = plt.figure(figsize=(15,3))\n",
"plt.plot(random_signal)\n",
"plt.show()\n"
]
},
{
"cell_type": "code",
"execution_count": 54,
"id": "a401dd59",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 1080x216 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# apply fft on signal\n",
"fft_signal = np.fft.fft(random_signal)\n",
"\n",
"fig = plt.figure(figsize=(15,3))\n",
"plt.plot(random_signal, label=\"original signal\")\n",
"plt.plot(fft_signal, label=\"fft signal\")\n",
"plt.legend()\n",
"plt.show()\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "bbbf47db",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.8"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment