diff --git a/Pragalbhv_MM19B012/Pragalbhv_assignment1.ipynb b/Pragalbhv_MM19B012/Pragalbhv_assignment1.ipynb
new file mode 100644
index 0000000..a0a16cb
--- /dev/null
+++ b/Pragalbhv_MM19B012/Pragalbhv_assignment1.ipynb
@@ -0,0 +1,179 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Question1\n",
+ "Create two vectors π¦ and π¦Μ having the same dimensions, where π¦Μ should consist of random numbers between [0,1) and π¦ should contain 0π and1π , for example, π¦=[0,1,1,0,1,0,0,1,...,1]. Compute the Cross-Entropy loss function\n",
+ "\n",
+ "n = 100, is the total number of elementsin y and π¦Μ\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "\n",
+ "import numpy as np\n",
+ "class q1():\n",
+ " def __init__(self,n=100):\n",
+ " self.n=n\n",
+ " self.y_hat=np.random.random(self.n)\n",
+ " self.y=np.random.randint(0,2,self.n)\n",
+ " \n",
+ " def check(self,a,b,c):# to test testcases\n",
+ " self.n=a\n",
+ " self.y_hat=b\n",
+ " self.y=c\n",
+ " \n",
+ " def crossentropy(self):\n",
+ " O=self.y*np.log2(self.y_hat)+(1-self.y)*np.log2(1-self.y_hat)\n",
+ " O=-sum(O)/self.n\n",
+ " return O\n",
+ " \n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 68,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# b=q1(5)\n",
+ "# b.check(5,np.array([0.32, 0.56, 0.71, 0.14, 0.57]),np.array([1, 0, 1, 1, 0]))\n",
+ "# b.check(4,np.array([0.23, 0.54, 0.61, 0.89]),np.array([0, 0, 1, 1]))\n",
+ "# b.crossentropy()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "y: [0 0 0 1 1 1 1 1 1 1 0 1 0 0 1 1 0 1 1 0 1 1 0 0 0 1 0 0 0 1 1 0 0 0 1 0 1\n",
+ " 0 0 0 1 0 0 1 1 0 1 1 1 1 1 1 0 0 1 1 0 0 1 0 1 1 1 1 0 1 1 1 1 0 1 0 0 0\n",
+ " 1 1 1 1 1 0 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 1]\n",
+ "y^: [0.51021649 0.72948491 0.77934699 0.16864048 0.9810205 0.52897531\n",
+ " 0.42077713 0.24993429 0.29245122 0.47707456 0.68231908 0.24288666\n",
+ " 0.12652212 0.28854146 0.44658798 0.76661013 0.9325786 0.85773805\n",
+ " 0.94331178 0.06502094 0.42803983 0.98628899 0.62867782 0.82255184\n",
+ " 0.9620715 0.05291848 0.75515617 0.56735066 0.24574422 0.7224453\n",
+ " 0.6380315 0.01306936 0.77109653 0.48600201 0.36626264 0.29992089\n",
+ " 0.92651081 0.69393579 0.29673897 0.5465854 0.47831487 0.28070568\n",
+ " 0.14715873 0.81778697 0.66073728 0.46008507 0.9584546 0.32148232\n",
+ " 0.82442716 0.75120344 0.371478 0.09903866 0.63822627 0.98822728\n",
+ " 0.83935984 0.41268517 0.65951624 0.46678992 0.86718493 0.26555129\n",
+ " 0.22640279 0.40830547 0.01748741 0.9900541 0.35860553 0.82219612\n",
+ " 0.53973776 0.28845018 0.91035037 0.93150135 0.30976138 0.03925348\n",
+ " 0.35523396 0.18286391 0.65574514 0.90833396 0.26349271 0.53125752\n",
+ " 0.58091839 0.87783523 0.02759129 0.97593767 0.57664664 0.74691748\n",
+ " 0.49616255 0.71016896 0.58393564 0.13386478 0.51870505 0.74418914\n",
+ " 0.32108295 0.42511076 0.07943298 0.24763562 0.32567092 0.83955447\n",
+ " 0.04961893 0.28661403 0.01968282 0.99951812]\n",
+ "O: 1.307509498109142\n"
+ ]
+ }
+ ],
+ "source": [
+ "answer1=q1()\n",
+ "print('y: ',answer1.y)\n",
+ "print('y^: ',answer1.y_hat)\n",
+ "print('O: ',answer1.crossentropy())\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Question 2\n",
+ "Write a Python class to find a pair of elements (indices of the two numbers) from a given array whose sum equals a specific target number"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "class findpair():\n",
+ " def __init__(self,arr,target):\n",
+ " self.dicta=dict()\n",
+ " self.arr=arr\n",
+ " self.target=target\n",
+ " \n",
+ " def find(self):\n",
+ " N=len(self.arr)\n",
+ " count=1\n",
+ " for i in range(N):\n",
+ " for j in range(N):\n",
+ " if self.arr[i]+self.arr[j]==self.target:\n",
+ " self.dicta[count]=[i,j]\n",
+ " count+=1\n",
+ " return self.dicta\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "10 20 10 40 50 60 70\n",
+ "50\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "{1: [0, 3], 2: [2, 3], 3: [3, 0], 4: [3, 2]}"
+ ]
+ },
+ "execution_count": 22,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "\n",
+ "array=input() #assumed to be 1 23 45 66 and such...\n",
+ "target=int(input())\n",
+ "arr=list(map(int,array.strip(' ').split()))\n",
+ "#___\n",
+ "answer2=findpair(arr,target)\n",
+ "answer2.find()"
+ ]
+ }
+ ],
+ "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.8.5"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/Python_and_GIT_Basics_Summer_School.ipynb b/Python_and_GIT_Basics_Summer_School.ipynb
index 2a48f0e..2a6ef0c 100644
--- a/Python_and_GIT_Basics_Summer_School.ipynb
+++ b/Python_and_GIT_Basics_Summer_School.ipynb
@@ -1,8514 +1,4075 @@
{
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "ocxMXW4wcLuM"
- },
- "source": [
- ""
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "JGXgeI7DpmWx"
- },
- "source": [
- ""
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "Jw-ybw_DqGGJ"
- },
- "source": [
- ""
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "M-wcrzB1qI11"
- },
- "source": [
- ""
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "MP-rRuuoqM7P"
- },
- "source": [
- ""
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "4CSgt9bqD8Ia"
- },
- "source": [
- "## Why Python?\n",
- "\n",
- "\n",
- "* It's easier to learn and use in comparison to other languages like C++ or Java, due to its simpler syntax.\n",
- "\n",
- "* It has a huge, rapidly growing supportive community\n",
- "\n",
- "* It has a large number of libraries and frameworks made by third parties. This makes it even easier to use python\n",
- "\n",
- "These reasons make Python extremely popular in the AI community.\n",
- "\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "hpmHarMoKRqy",
- "outputId": "f980cc2a-c6d4-4abb-8afd-d3d73b2f3b71"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "hello world!\n"
- ]
- }
- ],
- "source": [
- "print(\"hello world!\")\n",
- "# This statement is all it takes to print \"hello\"\n",
- "# These lines are called comments\n",
- "# adding a '#' before a line makes it a comment\n",
- "# The compiler ignores comments\n",
- "# They can be used to explain code or comment out some lines of code to prevent their execution "
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "P9d9lPfUTipz"
- },
- "source": [
- "## Contents\n",
- "\n",
- "\n",
- "* Data types\n",
- "* Operators\n",
- "* Conditional Statements\n",
- "* Loops \n",
- "* Functions\n",
- "* Classes\n",
- "* Lists\n",
- "* Tuples \n",
- "* Dictionary\n",
- "* Python Library\n",
- "* Numpy\n",
- "* Matplotlib\n",
- "* Git & GitHub\n",
- "\n",
- "\n",
- "\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "R5Tdviy-VwjX"
- },
- "source": []
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "aH-Vh_TRVwr7"
- },
- "source": [
- "## Data types\n",
- "\n",
- "* Variables are classified using data types\n",
- "\n",
- "* Each data type gives a variable different properties\n",
- "\n",
- "* Using data types lets us know what is expected from each variable; \n",
- "\n",
- "* Furthermore, functions react differently to variables based on their data type\n",
- "\n",
- "The most commonly used data types are :\n",
- "\n",
- "\n",
- "* Numeric: \n",
- " * int (integers)\n",
- " * float (decimal values)\n",
- "\n",
- "* strings (characters, words and sentences)\n",
- "\n",
- "* bool (boolean values, i.e. True or False)\n",
- "\n",
- "* Sequential Data Types:\n",
- " * list\n",
- " * tuple\n",
- " * range \n",
- "\n",
- "* set (Sets)\n",
- "* dict (Dictionaries)\n",
- "\n",
- "\n",
- "There are several other data types but we'll be focusing on these in this session.\n",
- "\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "id": "N0_Qh7uHXbIx"
- },
- "outputs": [],
- "source": [
- "x = 10 \n",
- "name = \"Student\"\n",
- "\n",
- "print(x)\n",
- "print(name)\n",
- "\n",
- "print(type(x))\n",
- "print(type(name))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "94ajOCm5XpsA"
- },
- "source": [
- "This example shows that Python doesn't require us to declare the data type for a variable. \n",
- "\n",
- "This is unlike many other popular programming languages.\n",
- "\n",
- "It is capable of infering the data type from the value assigned to the variable."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "2NcjikVaBuvZ"
- },
- "source": []
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "4AjgJNPhCwFA"
- },
- "source": [
- "##Operators\n",
- "Operators perfom processes on variables and constants. The different kinds of operators can be understood through examples.\n",
- "\n",
- "###Arithmetic Operators\n",
- "\n",
- "\n",
- "1. Addition (+)\n",
- "2. Subtraction (-)\n",
- "3. Multiplication (*)\n",
- "4. Division (/)\n",
- "5. Modulus(%)\n",
- "6. Exponent(**)\n",
- "\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "tSkILN2FDhrC",
- "outputId": "cc481202-5711-442c-a459-d86356399bdc"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "a + b = 11\n",
- "b - 2 = 4\n",
- "a*4 = 20\n",
- "b/3 = 2.0\n",
- "a % b = 5\n",
- "a^2 = 25\n"
- ]
- }
- ],
- "source": [
- "a = 5\n",
- "b = 6\n",
- "\n",
- "# operations in order\n",
- "\n",
- "print('a + b = ', a + b)\n",
- "print('b - 2 = ', b - 2)\n",
- "print('a*4 =', a * 4)\n",
- "print('b/3 = ', b/3)\n",
- "print('a % b = ', a%b)\n",
- "print('a^2 = ', a**2 )\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "qOn_PEWPDqgB"
- },
- "source": [
- "###Comparison Operators\n",
- "\n",
- "\n",
- "1. Check equality (== )\n",
- "2. Check inequality(!= or <>)\n",
- "3. Greater than (>)\n",
- "4. Less than(<)\n",
- "5. Greater than or equal to (>=)\n",
- "6. Less than or equal to (<=)\n",
- "\n",
- "When used in expressions, the truth value of the expression returned. \n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "id": "mhRC0bPOEYno"
- },
- "outputs": [],
- "source": [
- "a = 5\n",
- "b = 6\n",
- "\n",
- "#operations in order\n",
- "\n",
- "print(a==b)\n",
- "print(b!=2)\n",
- "print(a>4)\n",
- "print(b<3)\n",
- "print(a>=b)\n",
- "print(a<=2)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "KSeM7cmOEfFq"
- },
- "source": [
- "###Logical Operators\n",
- "\n",
- "\n",
- "\n",
- "1. and\n",
- "2. or\n",
- "3. not\n",
- "\n",
- "When used in expressions, the truth value of the expression returned.\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "id": "cfbb9e-CEo00"
- },
- "outputs": [],
- "source": [
- "a = 5\n",
- "b = 6\n",
- "if(a==b and b>5):\n",
- " print(\"something\")\n",
- "\n",
- "if(a==5 or b==2):\n",
- " print(\"some other thing\")\n",
- "\n",
- "if(not b==9):\n",
- " print(\"b is not equal to 9\") "
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "wRCvlO4Cpdzm"
- },
- "source": [
- "##Conditional Statements\n",
- "\n",
- "Conditional Statements are used in decision making."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "id": "YDjv_d1SbiU5"
- },
- "outputs": [],
- "source": [
- "a = 100 #assignment\n",
- "\n",
- "if a == 100: #comparison\n",
- " print(\"ok\") #indentation\n",
- "else:\n",
- " print(\"not ok\")"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "fR1NevmkrpYC"
- },
- "source": [
- "Here we had to make a decision based on the value of a - whether to print 'nice' or not. That is what we use the following *keywords* for:\n",
- "\n",
- "\n",
- "* if\n",
- "* else\n",
- "* elif\n",
- "\n",
- "These make use of test expressions, logical operations that evaluate to TRUE or FALSE - *if* the expression is true, the part indented below the 'if' expression is executed. Otherwise, it is ignored.\n",
- "\n",
- "The use of 'else' and 'elif' can be somewhat intuitively understood by the following code.\n",
- "\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "id": "rYFcNu_7skg3"
- },
- "outputs": [],
- "source": [
- "b = 70\n",
- "if b == 100:\n",
- " print('alright')\n",
- "elif b == 70: # if multiple 'elif's evaluate to true, only the first one is executed\n",
- " print('ok')\n",
- "else:\n",
- " print('not ok')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "yxmh6_DKs_0y"
- },
- "source": [
- "##Loops\n",
- "Let's look at two programs with the same output:\n",
- "\n",
- "\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "id": "r4vqxmA4wv1J"
- },
- "outputs": [],
- "source": [
- "print('welcome to summer school')\n",
- "print('welcome to summer school')\n",
- "print('welcome to summer school')\n",
- "print('welcome to summer school')\n",
- "print('welcome to summer school')\n",
- "print('welcome to summer school')\n",
- "print('welcome to summer school')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "id": "c11KUDuMxN9q"
- },
- "outputs": [],
- "source": [
- "t = 0 \n",
- "while( t < 7):\n",
- " print(\"welcome to summer school\")\n",
- " t = t + 1 #incrementing t"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "NgLRIhSUxaRZ"
- },
- "source": [
- "Which of those two programs seemed more efficient? Furthermore, the first method would be impractical for tasks that need to be repeated thousands of times, as is the case in modern times. \n",
- "\n",
- "There are two kinds of loops in Python\n",
- "\n",
- "* ones in which the no. of iterations don't have to be specified, in other words, a terminating condition will do (while loops)\n",
- "\n",
- "* ones in which the no. of iterations have to be specified (for loops)\n",
- "\n",
- "Each repeating step in a loop is called an *iteration*\n",
- "\n",
- "###While loop\n",
- "\n",
- "The while loop has the following form:"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "id": "QUVvvaq8yOzt"
- },
- "outputs": [],
- "source": [
- "i = 0\n",
- "while(i < 10):\n",
- " print(i)\n",
- " i = i + 1"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "VLeQ-XeAyVUG"
- },
- "source": [
- "As you can see, we did not specify the number of iterations.\n",
- "\n",
- "Loops make use of a test expression as well - they check the expression before each iteration, and execute said iteration only if the test expression evaluates to \"TRUE\"\n",
- "\n",
- "##For Loop\n",
- "\n",
- "We also have the *for* loop, where we do have to specify the number of iterations. Let's look at some example code:"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "s2iJWRJk69J5",
- "outputId": "17c130d7-c1c0-4d05-dc2c-f5bb9012f92e"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "0\n",
- "1\n",
- "2\n",
- "3\n",
- "4\n"
- ]
- }
- ],
- "source": [
- "for i in range(0,5,1):\n",
- "\tprint(i)\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "en1WEIPWd1lH"
- },
- "source": [
- "## Nested Loops\n",
- "\n",
- "Loops within loops"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "T3WpF5taQDDU",
- "outputId": "5c8760f6-bac4-4867-95a0-1c3d6c3f71c4"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "1\n",
- "12\n",
- "123\n",
- "1234\n"
- ]
- }
- ],
- "source": [
- "x = 4\n",
- "for i in range(1, x + 1):\n",
- " for j in range(1, i + 1):\n",
- " print(j, end = '')\n",
- " print('')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "ojNbEV08gXNn"
- },
- "source": [
- "### Example: Fibonacci Sequence \n",
- "\n",
- "The fibonacci sequence is a sequence in which:\n",
- "\n",
- "(an denotes the nth element)\n",
- "\n",
- "* a1 = 0 \n",
- "\n",
- "* a2 = 1\n",
- "\n",
- "* for n > 2, the an = an - 1 + an - 2 \n",
- "\n",
- "0, 1, 1, 2, 3, 5, 8 ... ,an - 2, an - 1, an - 1 + an - 2"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "id": "yWjO9U-0SzXj"
- },
- "outputs": [],
- "source": [
- "x = int(input()) #to accept input from the user, and then convert it to an integer\n",
- "if x<=0:\n",
- " print(\"Invalid input. Enter a positive integer.\")\n",
- "else:\n",
- " if x == 1:\n",
- " print('0')\n",
- " else:\n",
- " print('0, 1', end = '')\n",
- " \n",
- " if x > 2:\n",
- " a = 0\n",
- " b = 1\n",
- " for i in range(3, x+1):\n",
- " c = a + b\n",
- " print(', ', c, end = '')\n",
- " a = b\n",
- " b = c\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "CcPb8jUeN2hs"
- },
- "source": [
- "##Example Problem: Adding Reversed Numbers\n",
- "\n",
- "Based on the SPOJ.com problem: https://www.spoj.com/problems/ADDREV/\n",
- "\n",
- "Given two integers, reverse their digits and add them."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "id": "GXQTBfaLk4DV"
- },
- "outputs": [],
- "source": [
- "# enter your code here"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "-Y3VxgxiACFx"
- },
- "source": [
- "## Functions\n",
- "\n",
- "* Functions are modules of code that accomplish a specific task. \n",
- "* A function executes only when it is called.\n",
- "* Functions usually take inputs (data), process it, and output (or return) result. Once a function is written, it can be used over and over again."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "id": "eWsZApVTAGrl"
- },
- "outputs": [],
- "source": [
- "# example function\n",
- "def add_nums(a, b):\n",
- " return a+b\n",
- "\n",
- "print(add_nums(2,3)) #function call inside the print statement and even print is a function call"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "UB8Dmu16jGHe"
- },
- "source": [
- "Well at this point you might think, why do we even need functions? it would be easier to type a+b than add_nums(a,b)\n",
- "\n",
- "But what happens when you have bigger pieces of code that you want to run?\n",
- "\n",
- "Let's say you want to check if a number is even or odd"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "id": "nBGuqI1Gi7OL"
- },
- "outputs": [],
- "source": [
- "def odd_even(num):\n",
- " if num % 2 == 0:\n",
- " return 'Even'\n",
- " else:\n",
- " return 'Odd'"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "id": "v4azWl0PjkXp"
- },
- "outputs": [],
- "source": [
- "print(odd_even(4), odd_even(6), odd_even(5))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "3jBci86hjxiF"
- },
- "source": [
- "Clearly, that saved us a lot of time and unnecesary typing of code."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "iH9I-9ljAL85"
- },
- "source": [
- "## Classes\n",
- "\n",
- "A class is a blueprint for an object.\n",
- "\n",
- "It is a way to bundle data (even of different data types) together. \n",
- "Each variable or piece of data is known as an attribute of the class.\n",
- "\n",
- "In addition, a class can have functions associated with it called methods.\n",
- "\n",
- "An object is an instance of a class. This is similar to how the variable \"num\" was an integer in the previous example.\n",
- "\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "kIIciT0ZAPkg",
- "outputId": "677ea205-2a91-43f9-ba0c-cf3bae941e21"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "My favorite programming language is python\n",
- "3.14\n"
- ]
- }
- ],
- "source": [
- "# example class\n",
- "\n",
- "class MyClass:\n",
- " language = \"python\"\n",
- " x = 3.14\n",
- " isTrue = True\n",
- "\n",
- " # member function/ method\n",
- " def show(self):\n",
- " print('My favorite programming language is', self.language)\n",
- " print(self.x) \n",
- "\n",
- "c1 = MyClass() # creating an instance of a MyClass\n",
- "c1.show()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "MPS3xntdR60s"
- },
- "source": [
- "### self\n",
- "* class methods must include an extra first parameter in the method definition \n",
- "\n",
- "* we don't give assign values for this parameter when we call the method, intstead Python provides it\n",
- "\n",
- "* if we have a method that takes no arguments, then we still have to have one argument.\n",
- "\n",
- "* self is similar to this pointer in C++ and this reference in Java"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "StEaVKmGQWJz"
- },
- "source": [
- "### \\_init_()\n",
- "\n",
- "* The \\__init__ method is similar to constructors in C++ and Java\n",
- "\n",
- "* constructors are used to initialize the objectβs state\n",
- "\n",
- "* like other methods, a constructor also contains a collection of statements that are executed at the time of object creation\n",
- "\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "mg69KjuaQEn4",
- "outputId": "24c7734c-0dd8-4692-cbdb-f5064f0d9c4a"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "C1 details: Vehicle type: car\n",
- "company: Ferrari\n",
- "color: red\n",
- "\n",
- "accessing class variable using class name\n",
- "red\n",
- "Mercedes\n"
- ]
- }
- ],
- "source": [
- "class Vehicle:\n",
- " \n",
- " # class Variable\n",
- " vehicle_type = 'car' \n",
- "\n",
- " # init method or constructor\n",
- " def __init__(self, company, color):\n",
- " \n",
- " # instance variables \n",
- "\n",
- " self.company = company\n",
- " self.color = color \n",
- " \n",
- " # method to display details\n",
- " def show(self): \n",
- " print('Vehicle type: ', self.vehicle_type)\n",
- " print('company: ', self.company)\n",
- " print('color: ', self.color)\n",
- " \n",
- "\n",
- "# Objects of Dog class\n",
- "C1 = Vehicle(\"Ferrari\", \"red\")\n",
- "C2 = Vehicle(\"Mercedes\", \"gold\")\n",
- " \n",
- "# displays details of C1 \n",
- "print('C1 details: ', end = '') \n",
- "C1.show()\n",
- " \n",
- "# accessing using class names\n",
- "print(\"\\naccessing class variable using class name\")\n",
- "print(C1.color)\n",
- "print(C2.company)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "QllyOobJPgfM"
- },
- "source": [
- "## Lists\n",
- "\n",
- "A list is a collections of entries that is ordered and can be changed. They also allow duplicate entries. Entries of a list don't need to be of the same datatype. Look at some of the examples given below"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "b2E3u0hA42AO"
- },
- "source": [
- ""
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "may4Qsi6PjL3",
- "outputId": "0a0e25e3-f77d-426f-ecd5-0926f69f3a9e"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "['Hello', 2, True, 'The End']\n"
- ]
- }
- ],
- "source": [
- "a = ['Hello', 2, True, 'The End']\n",
- "print(a)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "QToWvYjaRueq"
- },
- "source": [
- "You can access individual members of the list too!!\n",
- "\n",
- "Remember that the indexing starts from 0\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "kmCx-11oRxAT",
- "outputId": "6e77035f-d1bf-4ab3-a0c7-7e24fb874e20"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Hello True\n"
- ]
- }
- ],
- "source": [
- "print(a[0], a[2])"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "dSfPPJALR1HB"
- },
- "source": [
- "You can find out about the length of a list using the len function"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "WEDaQXaJR1ok",
- "outputId": "1ab97250-ee42-4b8b-978a-9385b95cd057"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "4\n"
- ]
- }
- ],
- "source": [
- "print(len(a))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "sIi7ReCNR4GD"
- },
- "source": [
- "You learnt about for loops earlier right? Let's use that to make a slightly bigger list using the append function"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "6OFDFyBpR4ac",
- "outputId": "3a20cf87-c3bd-4d3e-b111-41fb85b73b5e"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "[]\n",
- "[0]\n",
- "[0, 1]\n",
- "[0, 1, 2]\n",
- "[0, 1, 2, 3]\n",
- "[0, 1, 2, 3, 4]\n",
- "[0, 1, 2, 3, 4, 5]\n",
- "[0, 1, 2, 3, 4, 5, 6]\n",
- "[0, 1, 2, 3, 4, 5, 6, 7]\n",
- "[0, 1, 2, 3, 4, 5, 6, 7, 8]\n",
- "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n"
- ]
- }
- ],
- "source": [
- "b = [] #Declare an empty list to which we will add elements\n",
- "print(b)\n",
- "for num in range(10):\n",
- " b.append(num) # It's that simple!!!!\n",
- " print(b)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "LMJF3eq4SCEq",
- "outputId": "6af6b2c8-4101-4178-bb7e-ef5ab502e219"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "[1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1164, 1165, 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, 1263, 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1272, 1273, 1274, 1275, 1276, 1277, 1278, 1279, 1280, 1281, 1282, 1283, 1284, 1285, 1286, 1287, 1288, 1289, 1290, 1291, 1292, 1293, 1294, 1295, 1296, 1297, 1298, 1299, 1300, 1301, 1302, 1303, 1304, 1305, 1306, 1307, 1308, 1309, 1310, 1311, 1312, 1313, 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1321, 1322, 1323, 1324, 1325, 1326, 1327, 1328, 1329, 1330, 1331, 1332, 1333, 1334, 1335, 1336, 1337, 1338, 1339, 1340, 1341, 1342, 1343, 1344, 1345, 1346, 1347, 1348, 1349, 1350, 1351, 1352, 1353, 1354, 1355, 1356, 1357, 1358, 1359, 1360, 1361, 1362, 1363, 1364, 1365, 1366, 1367, 1368, 1369, 1370, 1371, 1372, 1373, 1374, 1375, 1376, 1377, 1378, 1379, 1380, 1381, 1382, 1383, 1384, 1385, 1386, 1387, 1388, 1389, 1390, 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399, 1400, 1401, 1402, 1403, 1404, 1405, 1406, 1407, 1408, 1409, 1410, 1411, 1412, 1413, 1414, 1415, 1416, 1417, 1418, 1419, 1420, 1421, 1422, 1423, 1424, 1425, 1426, 1427, 1428, 1429, 1430, 1431, 1432, 1433, 1434, 1435, 1436, 1437, 1438, 1439, 1440, 1441, 1442, 1443, 1444, 1445, 1446, 1447, 1448, 1449, 1450, 1451, 1452, 1453, 1454, 1455, 1456, 1457, 1458, 1459, 1460, 1461, 1462, 1463, 1464, 1465, 1466, 1467, 1468, 1469, 1470, 1471, 1472, 1473, 1474, 1475, 1476, 1477, 1478, 1479, 1480, 1481, 1482, 1483, 1484, 1485, 1486, 1487, 1488, 1489, 1490, 1491, 1492, 1493, 1494, 1495, 1496, 1497, 1498, 1499, 1500, 1501, 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1511, 1512, 1513, 1514, 1515, 1516, 1517, 1518, 1519, 1520, 1521, 1522, 1523, 1524, 1525, 1526, 1527, 1528, 1529, 1530, 1531, 1532, 1533, 1534, 1535, 1536, 1537, 1538, 1539, 1540, 1541, 1542, 1543, 1544, 1545, 1546, 1547, 1548, 1549, 1550, 1551, 1552, 1553, 1554, 1555, 1556, 1557, 1558, 1559, 1560, 1561, 1562, 1563, 1564, 1565, 1566, 1567, 1568, 1569, 1570, 1571, 1572, 1573, 1574, 1575, 1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, 1584, 1585, 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593, 1594, 1595, 1596, 1597, 1598, 1599, 1600, 1601, 1602, 1603, 1604, 1605, 1606, 1607, 1608, 1609, 1610, 1611, 1612, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 1620, 1621, 1622, 1623, 1624, 1625, 1626, 1627, 1628, 1629, 1630, 1631, 1632, 1633, 1634, 1635, 1636, 1637, 1638, 1639, 1640, 1641, 1642, 1643, 1644, 1645, 1646, 1647, 1648, 1649, 1650, 1651, 1652, 1653, 1654, 1655, 1656, 1657, 1658, 1659, 1660, 1661, 1662, 1663, 1664, 1665, 1666, 1667, 1668, 1669, 1670, 1671, 1672, 1673, 1674, 1675, 1676, 1677, 1678, 1679, 1680, 1681, 1682, 1683, 1684, 1685, 1686, 1687, 1688, 1689, 1690, 1691, 1692, 1693, 1694, 1695, 1696, 1697, 1698, 1699, 1700, 1701, 1702, 1703, 1704, 1705, 1706, 1707, 1708, 1709, 1710, 1711, 1712, 1713, 1714, 1715, 1716, 1717, 1718, 1719, 1720, 1721, 1722, 1723, 1724, 1725, 1726, 1727, 1728, 1729, 1730, 1731, 1732, 1733, 1734, 1735, 1736, 1737, 1738, 1739, 1740, 1741, 1742, 1743, 1744, 1745, 1746, 1747, 1748, 1749, 1750, 1751, 1752, 1753, 1754, 1755, 1756, 1757, 1758, 1759, 1760, 1761, 1762, 1763, 1764, 1765, 1766, 1767, 1768, 1769, 1770, 1771, 1772, 1773, 1774, 1775, 1776, 1777, 1778, 1779, 1780, 1781, 1782, 1783, 1784, 1785, 1786, 1787, 1788, 1789, 1790, 1791, 1792, 1793, 1794, 1795, 1796, 1797, 1798, 1799, 1800, 1801, 1802, 1803, 1804, 1805, 1806, 1807, 1808, 1809, 1810, 1811, 1812, 1813, 1814, 1815, 1816, 1817, 1818, 1819, 1820, 1821, 1822, 1823, 1824, 1825, 1826, 1827, 1828, 1829, 1830, 1831, 1832, 1833, 1834, 1835, 1836, 1837, 1838, 1839, 1840, 1841, 1842, 1843, 1844, 1845, 1846, 1847, 1848, 1849, 1850, 1851, 1852, 1853, 1854, 1855, 1856, 1857, 1858, 1859, 1860, 1861, 1862, 1863, 1864, 1865, 1866, 1867, 1868, 1869, 1870, 1871, 1872, 1873, 1874, 1875, 1876, 1877, 1878, 1879, 1880, 1881, 1882, 1883, 1884, 1885, 1886, 1887, 1888, 1889, 1890, 1891, 1892, 1893, 1894, 1895, 1896, 1897, 1898, 1899, 1900, 1901, 1902, 1903, 1904, 1905, 1906, 1907, 1908, 1909, 1910, 1911, 1912, 1913, 1914, 1915, 1916, 1917, 1918, 1919, 1920, 1921, 1922, 1923, 1924, 1925, 1926, 1927, 1928, 1929, 1930, 1931, 1932, 1933, 1934, 1935, 1936, 1937, 1938, 1939, 1940, 1941, 1942, 1943, 1944, 1945, 1946, 1947, 1948, 1949, 1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, 1958, 1959, 1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026, 2027, 2028, 2029, 2030, 2031, 2032, 2033, 2034, 2035, 2036, 2037, 2038, 2039, 2040, 2041, 2042, 2043, 2044, 2045, 2046, 2047, 2048, 2049, 2050, 2051, 2052, 2053, 2054, 2055, 2056, 2057, 2058, 2059, 2060, 2061, 2062, 2063, 2064, 2065, 2066, 2067, 2068, 2069, 2070, 2071, 2072, 2073, 2074, 2075, 2076, 2077, 2078, 2079, 2080, 2081, 2082, 2083, 2084, 2085, 2086, 2087, 2088, 2089, 2090, 2091, 2092, 2093, 2094, 2095, 2096, 2097, 2098, 2099, 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107, 2108, 2109, 2110, 2111, 2112, 2113, 2114, 2115, 2116, 2117, 2118, 2119, 2120, 2121, 2122, 2123, 2124, 2125, 2126, 2127, 2128, 2129, 2130, 2131, 2132, 2133, 2134, 2135, 2136, 2137, 2138, 2139, 2140, 2141, 2142, 2143, 2144, 2145, 2146, 2147, 2148, 2149, 2150, 2151, 2152, 2153, 2154, 2155, 2156, 2157, 2158, 2159, 2160, 2161, 2162, 2163, 2164, 2165, 2166, 2167, 2168, 2169, 2170, 2171, 2172, 2173, 2174, 2175, 2176, 2177, 2178, 2179, 2180, 2181, 2182, 2183, 2184, 2185, 2186, 2187, 2188, 2189, 2190, 2191, 2192, 2193, 2194, 2195, 2196, 2197, 2198, 2199, 2200, 2201, 2202, 2203, 2204, 2205, 2206, 2207, 2208, 2209, 2210, 2211, 2212, 2213, 2214, 2215, 2216, 2217, 2218, 2219, 2220, 2221, 2222, 2223, 2224, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2233, 2234, 2235, 2236, 2237, 2238, 2239, 2240, 2241, 2242, 2243, 2244, 2245, 2246, 2247, 2248, 2249, 2250, 2251, 2252, 2253, 2254, 2255, 2256, 2257, 2258, 2259, 2260, 2261, 2262, 2263, 2264, 2265, 2266, 2267, 2268, 2269, 2270, 2271, 2272, 2273, 2274, 2275, 2276, 2277, 2278, 2279, 2280, 2281, 2282, 2283, 2284, 2285, 2286, 2287, 2288, 2289, 2290, 2291, 2292, 2293, 2294, 2295, 2296, 2297, 2298, 2299, 2300, 2301, 2302, 2303, 2304, 2305, 2306, 2307, 2308, 2309, 2310, 2311, 2312, 2313, 2314, 2315, 2316, 2317, 2318, 2319, 2320, 2321, 2322, 2323, 2324, 2325, 2326, 2327, 2328, 2329, 2330, 2331, 2332, 2333, 2334, 2335, 2336, 2337, 2338, 2339, 2340, 2341, 2342, 2343, 2344, 2345, 2346, 2347, 2348, 2349, 2350, 2351, 2352, 2353, 2354, 2355, 2356, 2357, 2358, 2359, 2360, 2361, 2362, 2363, 2364, 2365, 2366, 2367, 2368, 2369, 2370, 2371, 2372, 2373, 2374, 2375, 2376, 2377, 2378, 2379, 2380, 2381, 2382, 2383, 2384, 2385, 2386, 2387, 2388, 2389, 2390, 2391, 2392, 2393, 2394, 2395, 2396, 2397, 2398, 2399, 2400, 2401, 2402, 2403, 2404, 2405, 2406, 2407, 2408, 2409, 2410, 2411, 2412, 2413, 2414, 2415, 2416, 2417, 2418, 2419, 2420, 2421, 2422, 2423, 2424, 2425, 2426, 2427, 2428, 2429, 2430, 2431, 2432, 2433, 2434, 2435, 2436, 2437, 2438, 2439, 2440, 2441, 2442, 2443, 2444, 2445, 2446, 2447, 2448, 2449, 2450, 2451, 2452, 2453, 2454, 2455, 2456, 2457, 2458, 2459, 2460, 2461, 2462, 2463, 2464, 2465, 2466, 2467, 2468, 2469, 2470, 2471, 2472, 2473, 2474, 2475, 2476, 2477, 2478, 2479, 2480, 2481, 2482, 2483, 2484, 2485, 2486, 2487, 2488, 2489, 2490, 2491, 2492, 2493, 2494, 2495, 2496, 2497, 2498, 2499, 2500, 2501, 2502, 2503, 2504, 2505, 2506, 2507, 2508, 2509, 2510, 2511, 2512, 2513, 2514, 2515, 2516, 2517, 2518, 2519, 2520, 2521, 2522, 2523, 2524, 2525, 2526, 2527, 2528, 2529, 2530, 2531, 2532, 2533, 2534, 2535, 2536, 2537, 2538, 2539, 2540, 2541, 2542, 2543, 2544, 2545, 2546, 2547, 2548, 2549, 2550, 2551, 2552, 2553, 2554, 2555, 2556, 2557, 2558, 2559, 2560, 2561, 2562, 2563, 2564, 2565, 2566, 2567, 2568, 2569, 2570, 2571, 2572, 2573, 2574, 2575, 2576, 2577, 2578, 2579, 2580, 2581, 2582, 2583, 2584, 2585, 2586, 2587, 2588, 2589, 2590, 2591, 2592, 2593, 2594, 2595, 2596, 2597, 2598, 2599, 2600, 2601, 2602, 2603, 2604, 2605, 2606, 2607, 2608, 2609, 2610, 2611, 2612, 2613, 2614, 2615, 2616, 2617, 2618, 2619, 2620, 2621, 2622, 2623, 2624, 2625, 2626, 2627, 2628, 2629, 2630, 2631, 2632, 2633, 2634, 2635, 2636, 2637, 2638, 2639, 2640, 2641, 2642, 2643, 2644, 2645, 2646, 2647, 2648, 2649, 2650, 2651, 2652, 2653, 2654, 2655, 2656, 2657, 2658, 2659, 2660, 2661, 2662, 2663, 2664, 2665, 2666, 2667, 2668, 2669, 2670, 2671, 2672, 2673, 2674, 2675, 2676, 2677, 2678, 2679, 2680, 2681, 2682, 2683, 2684, 2685, 2686, 2687, 2688, 2689, 2690, 2691, 2692, 2693, 2694, 2695, 2696, 2697, 2698, 2699, 2700, 2701, 2702, 2703, 2704, 2705, 2706, 2707, 2708, 2709, 2710, 2711, 2712, 2713, 2714, 2715, 2716, 2717, 2718, 2719, 2720, 2721, 2722, 2723, 2724, 2725, 2726, 2727, 2728, 2729, 2730, 2731, 2732, 2733, 2734, 2735, 2736, 2737, 2738, 2739, 2740, 2741, 2742, 2743, 2744, 2745, 2746, 2747, 2748, 2749, 2750, 2751, 2752, 2753, 2754, 2755, 2756, 2757, 2758, 2759, 2760, 2761, 2762, 2763, 2764, 2765, 2766, 2767, 2768, 2769, 2770, 2771, 2772, 2773, 2774, 2775, 2776, 2777, 2778, 2779, 2780, 2781, 2782, 2783, 2784, 2785, 2786, 2787, 2788, 2789, 2790, 2791, 2792, 2793, 2794, 2795, 2796, 2797, 2798, 2799, 2800, 2801, 2802, 2803, 2804, 2805, 2806, 2807, 2808, 2809, 2810, 2811, 2812, 2813, 2814, 2815, 2816, 2817, 2818, 2819, 2820, 2821, 2822, 2823, 2824, 2825, 2826, 2827, 2828, 2829, 2830, 2831, 2832, 2833, 2834, 2835, 2836, 2837, 2838, 2839, 2840, 2841, 2842, 2843, 2844, 2845, 2846, 2847, 2848, 2849, 2850, 2851, 2852, 2853, 2854, 2855, 2856, 2857, 2858, 2859, 2860, 2861, 2862, 2863, 2864, 2865, 2866, 2867, 2868, 2869, 2870, 2871, 2872, 2873, 2874, 2875, 2876, 2877, 2878, 2879, 2880, 2881, 2882, 2883, 2884, 2885, 2886, 2887, 2888, 2889, 2890, 2891, 2892, 2893, 2894, 2895, 2896, 2897, 2898, 2899, 2900, 2901, 2902, 2903, 2904, 2905, 2906, 2907, 2908, 2909, 2910, 2911, 2912, 2913, 2914, 2915, 2916, 2917, 2918, 2919, 2920, 2921, 2922, 2923, 2924, 2925, 2926, 2927, 2928, 2929, 2930, 2931, 2932, 2933, 2934, 2935, 2936, 2937, 2938, 2939, 2940, 2941, 2942, 2943, 2944, 2945, 2946, 2947, 2948, 2949, 2950, 2951, 2952, 2953, 2954, 2955, 2956, 2957, 2958, 2959, 2960, 2961, 2962, 2963, 2964, 2965, 2966, 2967, 2968, 2969, 2970, 2971, 2972, 2973, 2974, 2975, 2976, 2977, 2978, 2979, 2980, 2981, 2982, 2983, 2984, 2985, 2986, 2987, 2988, 2989, 2990, 2991, 2992, 2993, 2994, 2995, 2996, 2997, 2998, 2999, 3000, 3001, 3002, 3003, 3004, 3005, 3006, 3007, 3008, 3009, 3010, 3011, 3012, 3013, 3014, 3015, 3016, 3017, 3018, 3019, 3020, 3021, 3022, 3023, 3024, 3025, 3026, 3027, 3028, 3029, 3030, 3031, 3032, 3033, 3034, 3035, 3036, 3037, 3038, 3039, 3040, 3041, 3042, 3043, 3044, 3045, 3046, 3047, 3048, 3049, 3050, 3051, 3052, 3053, 3054, 3055, 3056, 3057, 3058, 3059, 3060, 3061, 3062, 3063, 3064, 3065, 3066, 3067, 3068, 3069, 3070, 3071, 3072, 3073, 3074, 3075, 3076, 3077, 3078, 3079, 3080, 3081, 3082, 3083, 3084, 3085, 3086, 3087, 3088, 3089, 3090, 3091, 3092, 3093, 3094, 3095, 3096, 3097, 3098, 3099, 3100, 3101, 3102, 3103, 3104, 3105, 3106, 3107, 3108, 3109, 3110, 3111, 3112, 3113, 3114, 3115, 3116, 3117, 3118, 3119, 3120, 3121, 3122, 3123, 3124, 3125, 3126, 3127, 3128, 3129, 3130, 3131, 3132, 3133, 3134, 3135, 3136, 3137, 3138, 3139, 3140, 3141, 3142, 3143, 3144, 3145, 3146, 3147, 3148, 3149, 3150, 3151, 3152, 3153, 3154, 3155, 3156, 3157, 3158, 3159, 3160, 3161, 3162, 3163, 3164, 3165, 3166, 3167, 3168, 3169, 3170, 3171, 3172, 3173, 3174, 3175, 3176, 3177, 3178, 3179, 3180, 3181, 3182, 3183, 3184, 3185, 3186, 3187, 3188, 3189, 3190, 3191, 3192, 3193, 3194, 3195, 3196, 3197, 3198, 3199, 3200, 3201, 3202, 3203, 3204, 3205, 3206, 3207, 3208, 3209, 3210, 3211, 3212, 3213, 3214, 3215, 3216, 3217, 3218, 3219, 3220, 3221, 3222, 3223, 3224, 3225, 3226, 3227, 3228, 3229, 3230, 3231, 3232, 3233, 3234, 3235, 3236, 3237, 3238, 3239, 3240, 3241, 3242, 3243, 3244, 3245, 3246, 3247, 3248, 3249, 3250, 3251, 3252, 3253, 3254, 3255, 3256, 3257, 3258, 3259, 3260, 3261, 3262, 3263, 3264, 3265, 3266, 3267, 3268, 3269, 3270, 3271, 3272, 3273, 3274, 3275, 3276, 3277, 3278, 3279, 3280, 3281, 3282, 3283, 3284, 3285, 3286, 3287, 3288, 3289, 3290, 3291, 3292, 3293, 3294, 3295, 3296, 3297, 3298, 3299, 3300, 3301, 3302, 3303, 3304, 3305, 3306, 3307, 3308, 3309, 3310, 3311, 3312, 3313, 3314, 3315, 3316, 3317, 3318, 3319, 3320, 3321, 3322, 3323, 3324, 3325, 3326, 3327, 3328, 3329, 3330, 3331, 3332, 3333, 3334, 3335, 3336, 3337, 3338, 3339, 3340, 3341, 3342, 3343, 3344, 3345, 3346, 3347, 3348, 3349, 3350, 3351, 3352, 3353, 3354, 3355, 3356, 3357, 3358, 3359, 3360, 3361, 3362, 3363, 3364, 3365, 3366, 3367, 3368, 3369, 3370, 3371, 3372, 3373, 3374, 3375, 3376, 3377, 3378, 3379, 3380, 3381, 3382, 3383, 3384, 3385, 3386, 3387, 3388, 3389, 3390, 3391, 3392, 3393, 3394, 3395, 3396, 3397, 3398, 3399, 3400, 3401, 3402, 3403, 3404, 3405, 3406, 3407, 3408, 3409, 3410, 3411, 3412, 3413, 3414, 3415, 3416, 3417, 3418, 3419, 3420, 3421, 3422, 3423, 3424, 3425, 3426, 3427, 3428, 3429, 3430, 3431, 3432, 3433, 3434, 3435, 3436, 3437, 3438, 3439, 3440, 3441, 3442, 3443, 3444, 3445, 3446, 3447, 3448, 3449, 3450, 3451, 3452, 3453, 3454, 3455, 3456, 3457, 3458, 3459, 3460, 3461, 3462, 3463, 3464, 3465, 3466, 3467, 3468, 3469, 3470, 3471, 3472, 3473, 3474, 3475, 3476, 3477, 3478, 3479, 3480, 3481, 3482, 3483, 3484, 3485, 3486, 3487, 3488, 3489, 3490, 3491, 3492, 3493, 3494, 3495, 3496, 3497, 3498, 3499, 3500, 3501, 3502, 3503, 3504, 3505, 3506, 3507, 3508, 3509, 3510, 3511, 3512, 3513, 3514, 3515, 3516, 3517, 3518, 3519, 3520, 3521, 3522, 3523, 3524, 3525, 3526, 3527, 3528, 3529, 3530, 3531, 3532, 3533, 3534, 3535, 3536, 3537, 3538, 3539, 3540, 3541, 3542, 3543, 3544, 3545, 3546, 3547, 3548, 3549, 3550, 3551, 3552, 3553, 3554, 3555, 3556, 3557, 3558, 3559, 3560, 3561, 3562, 3563, 3564, 3565, 3566, 3567, 3568, 3569, 3570, 3571, 3572, 3573, 3574, 3575, 3576, 3577, 3578, 3579, 3580, 3581, 3582, 3583, 3584, 3585, 3586, 3587, 3588, 3589, 3590, 3591, 3592, 3593, 3594, 3595, 3596, 3597, 3598, 3599, 3600, 3601, 3602, 3603, 3604, 3605, 3606, 3607, 3608, 3609, 3610, 3611, 3612, 3613, 3614, 3615, 3616, 3617, 3618, 3619, 3620, 3621, 3622, 3623, 3624, 3625, 3626, 3627, 3628, 3629, 3630, 3631, 3632, 3633, 3634, 3635, 3636, 3637, 3638, 3639, 3640, 3641, 3642, 3643, 3644, 3645, 3646, 3647, 3648, 3649, 3650, 3651, 3652, 3653, 3654, 3655, 3656, 3657, 3658, 3659, 3660, 3661, 3662, 3663, 3664, 3665, 3666, 3667, 3668, 3669, 3670, 3671, 3672, 3673, 3674, 3675, 3676, 3677, 3678, 3679, 3680, 3681, 3682, 3683, 3684, 3685, 3686, 3687, 3688, 3689, 3690, 3691, 3692, 3693, 3694, 3695, 3696, 3697, 3698, 3699, 3700, 3701, 3702, 3703, 3704, 3705, 3706, 3707, 3708, 3709, 3710, 3711, 3712, 3713, 3714, 3715, 3716, 3717, 3718, 3719, 3720, 3721, 3722, 3723, 3724, 3725, 3726, 3727, 3728, 3729, 3730, 3731, 3732, 3733, 3734, 3735, 3736, 3737, 3738, 3739, 3740, 3741, 3742, 3743, 3744, 3745, 3746, 3747, 3748, 3749, 3750, 3751, 3752, 3753, 3754, 3755, 3756, 3757, 3758, 3759, 3760, 3761, 3762, 3763, 3764, 3765, 3766, 3767, 3768, 3769, 3770, 3771, 3772, 3773, 3774, 3775, 3776, 3777, 3778, 3779, 3780, 3781, 3782, 3783, 3784, 3785, 3786, 3787, 3788, 3789, 3790, 3791, 3792, 3793, 3794, 3795, 3796, 3797, 3798, 3799, 3800, 3801, 3802, 3803, 3804, 3805, 3806, 3807, 3808, 3809, 3810, 3811, 3812, 3813, 3814, 3815, 3816, 3817, 3818, 3819, 3820, 3821, 3822, 3823, 3824, 3825, 3826, 3827, 3828, 3829, 3830, 3831, 3832, 3833, 3834, 3835, 3836, 3837, 3838, 3839, 3840, 3841, 3842, 3843, 3844, 3845, 3846, 3847, 3848, 3849, 3850, 3851, 3852, 3853, 3854, 3855, 3856, 3857, 3858, 3859, 3860, 3861, 3862, 3863, 3864, 3865, 3866, 3867, 3868, 3869, 3870, 3871, 3872, 3873, 3874, 3875, 3876, 3877, 3878, 3879, 3880, 3881, 3882, 3883, 3884, 3885, 3886, 3887, 3888, 3889, 3890, 3891, 3892, 3893, 3894, 3895, 3896, 3897, 3898, 3899, 3900, 3901, 3902, 3903, 3904, 3905, 3906, 3907, 3908, 3909, 3910, 3911, 3912, 3913, 3914, 3915, 3916, 3917, 3918, 3919, 3920, 3921, 3922, 3923, 3924, 3925, 3926, 3927, 3928, 3929, 3930, 3931, 3932, 3933, 3934, 3935, 3936, 3937, 3938, 3939, 3940, 3941, 3942, 3943, 3944, 3945, 3946, 3947, 3948, 3949, 3950, 3951, 3952, 3953, 3954, 3955, 3956, 3957, 3958, 3959, 3960, 3961, 3962, 3963, 3964, 3965, 3966, 3967, 3968, 3969, 3970, 3971, 3972, 3973, 3974, 3975, 3976, 3977, 3978, 3979, 3980, 3981, 3982, 3983, 3984, 3985, 3986, 3987, 3988, 3989, 3990, 3991, 3992, 3993, 3994, 3995, 3996, 3997, 3998, 3999, 4000, 4001, 4002, 4003, 4004, 4005, 4006, 4007, 4008, 4009, 4010, 4011, 4012, 4013, 4014, 4015, 4016, 4017, 4018, 4019, 4020, 4021, 4022, 4023, 4024, 4025, 4026, 4027, 4028, 4029, 4030, 4031, 4032, 4033, 4034, 4035, 4036, 4037, 4038, 4039, 4040, 4041, 4042, 4043, 4044, 4045, 4046, 4047, 4048, 4049, 4050, 4051, 4052, 4053, 4054, 4055, 4056, 4057, 4058, 4059, 4060, 4061, 4062, 4063, 4064, 4065, 4066, 4067, 4068, 4069, 4070, 4071, 4072, 4073, 4074, 4075, 4076, 4077, 4078, 4079, 4080, 4081, 4082, 4083, 4084, 4085, 4086, 4087, 4088, 4089, 4090, 4091, 4092, 4093, 4094, 4095, 4096, 4097, 4098, 4099, 4100, 4101, 4102, 4103, 4104, 4105, 4106, 4107, 4108, 4109, 4110, 4111, 4112, 4113, 4114, 4115, 4116, 4117, 4118, 4119, 4120, 4121, 4122, 4123, 4124, 4125, 4126, 4127, 4128, 4129, 4130, 4131, 4132, 4133, 4134, 4135, 4136, 4137, 4138, 4139, 4140, 4141, 4142, 4143, 4144, 4145, 4146, 4147, 4148, 4149, 4150, 4151, 4152, 4153, 4154, 4155, 4156, 4157, 4158, 4159, 4160, 4161, 4162, 4163, 4164, 4165, 4166, 4167, 4168, 4169, 4170, 4171, 4172, 4173, 4174, 4175, 4176, 4177, 4178, 4179, 4180, 4181, 4182, 4183, 4184, 4185, 4186, 4187, 4188, 4189, 4190, 4191, 4192, 4193, 4194, 4195, 4196, 4197, 4198, 4199, 4200, 4201, 4202, 4203, 4204, 4205, 4206, 4207, 4208, 4209, 4210, 4211, 4212, 4213, 4214, 4215, 4216, 4217, 4218, 4219, 4220, 4221, 4222, 4223, 4224, 4225, 4226, 4227, 4228, 4229, 4230, 4231, 4232, 4233, 4234, 4235, 4236, 4237, 4238, 4239, 4240, 4241, 4242, 4243, 4244, 4245, 4246, 4247, 4248, 4249, 4250, 4251, 4252, 4253, 4254, 4255, 4256, 4257, 4258, 4259, 4260, 4261, 4262, 4263, 4264, 4265, 4266, 4267, 4268, 4269, 4270, 4271, 4272, 4273, 4274, 4275, 4276, 4277, 4278, 4279, 4280, 4281, 4282, 4283, 4284, 4285, 4286, 4287, 4288, 4289, 4290, 4291, 4292, 4293, 4294, 4295, 4296, 4297, 4298, 4299, 4300, 4301, 4302, 4303, 4304, 4305, 4306, 4307, 4308, 4309, 4310, 4311, 4312, 4313, 4314, 4315, 4316, 4317, 4318, 4319, 4320, 4321, 4322, 4323, 4324, 4325, 4326, 4327, 4328, 4329, 4330, 4331, 4332, 4333, 4334, 4335, 4336, 4337, 4338, 4339, 4340, 4341, 4342, 4343, 4344, 4345, 4346, 4347, 4348, 4349, 4350, 4351, 4352, 4353, 4354, 4355, 4356, 4357, 4358, 4359, 4360, 4361, 4362, 4363, 4364, 4365, 4366, 4367, 4368, 4369, 4370, 4371, 4372, 4373, 4374, 4375, 4376, 4377, 4378, 4379, 4380, 4381, 4382, 4383, 4384, 4385, 4386, 4387, 4388, 4389, 4390, 4391, 4392, 4393, 4394, 4395, 4396, 4397, 4398, 4399, 4400, 4401, 4402, 4403, 4404, 4405, 4406, 4407, 4408, 4409, 4410, 4411, 4412, 4413, 4414, 4415, 4416, 4417, 4418, 4419, 4420, 4421, 4422, 4423, 4424, 4425, 4426, 4427, 4428, 4429, 4430, 4431, 4432, 4433, 4434, 4435, 4436, 4437, 4438, 4439, 4440, 4441, 4442, 4443, 4444, 4445, 4446, 4447, 4448, 4449, 4450, 4451, 4452, 4453, 4454, 4455, 4456, 4457, 4458, 4459, 4460, 4461, 4462, 4463, 4464, 4465, 4466, 4467, 4468, 4469, 4470, 4471, 4472, 4473, 4474, 4475, 4476, 4477, 4478, 4479, 4480, 4481, 4482, 4483, 4484, 4485, 4486, 4487, 4488, 4489, 4490, 4491, 4492, 4493, 4494, 4495, 4496, 4497, 4498, 4499, 4500, 4501, 4502, 4503, 4504, 4505, 4506, 4507, 4508, 4509, 4510, 4511, 4512, 4513, 4514, 4515, 4516, 4517, 4518, 4519, 4520, 4521, 4522, 4523, 4524, 4525, 4526, 4527, 4528, 4529, 4530, 4531, 4532, 4533, 4534, 4535, 4536, 4537, 4538, 4539, 4540, 4541, 4542, 4543, 4544, 4545, 4546, 4547, 4548, 4549, 4550, 4551, 4552, 4553, 4554, 4555, 4556, 4557, 4558, 4559, 4560, 4561, 4562, 4563, 4564, 4565, 4566, 4567, 4568, 4569, 4570, 4571, 4572, 4573, 4574, 4575, 4576, 4577, 4578, 4579, 4580, 4581, 4582, 4583, 4584, 4585, 4586, 4587, 4588, 4589, 4590, 4591, 4592, 4593, 4594, 4595, 4596, 4597, 4598, 4599, 4600, 4601, 4602, 4603, 4604, 4605, 4606, 4607, 4608, 4609, 4610, 4611, 4612, 4613, 4614, 4615, 4616, 4617, 4618, 4619, 4620, 4621, 4622, 4623, 4624, 4625, 4626, 4627, 4628, 4629, 4630, 4631, 4632, 4633, 4634, 4635, 4636, 4637, 4638, 4639, 4640, 4641, 4642, 4643, 4644, 4645, 4646, 4647, 4648, 4649, 4650, 4651, 4652, 4653, 4654, 4655, 4656, 4657, 4658, 4659, 4660, 4661, 4662, 4663, 4664, 4665, 4666, 4667, 4668, 4669, 4670, 4671, 4672, 4673, 4674, 4675, 4676, 4677, 4678, 4679, 4680, 4681, 4682, 4683, 4684, 4685, 4686, 4687, 4688, 4689, 4690, 4691, 4692, 4693, 4694, 4695, 4696, 4697, 4698, 4699, 4700, 4701, 4702, 4703, 4704, 4705, 4706, 4707, 4708, 4709, 4710, 4711, 4712, 4713, 4714, 4715, 4716, 4717, 4718, 4719, 4720, 4721, 4722, 4723, 4724, 4725, 4726, 4727, 4728, 4729, 4730, 4731, 4732, 4733, 4734, 4735, 4736, 4737, 4738, 4739, 4740, 4741, 4742, 4743, 4744, 4745, 4746, 4747, 4748, 4749, 4750, 4751, 4752, 4753, 4754, 4755, 4756, 4757, 4758, 4759, 4760, 4761, 4762, 4763, 4764, 4765, 4766, 4767, 4768, 4769, 4770, 4771, 4772, 4773, 4774, 4775, 4776, 4777, 4778, 4779, 4780, 4781, 4782, 4783, 4784, 4785, 4786, 4787, 4788, 4789, 4790, 4791, 4792, 4793, 4794, 4795, 4796, 4797, 4798, 4799, 4800, 4801, 4802, 4803, 4804, 4805, 4806, 4807, 4808, 4809, 4810, 4811, 4812, 4813, 4814, 4815, 4816, 4817, 4818, 4819, 4820, 4821, 4822, 4823, 4824, 4825, 4826, 4827, 4828, 4829, 4830, 4831, 4832, 4833, 4834, 4835, 4836, 4837, 4838, 4839, 4840, 4841, 4842, 4843, 4844, 4845, 4846, 4847, 4848, 4849, 4850, 4851, 4852, 4853, 4854, 4855, 4856, 4857, 4858, 4859, 4860, 4861, 4862, 4863, 4864, 4865, 4866, 4867, 4868, 4869, 4870, 4871, 4872, 4873, 4874, 4875, 4876, 4877, 4878, 4879, 4880, 4881, 4882, 4883, 4884, 4885, 4886, 4887, 4888, 4889, 4890, 4891, 4892, 4893, 4894, 4895, 4896, 4897, 4898, 4899, 4900, 4901, 4902, 4903, 4904, 4905, 4906, 4907, 4908, 4909, 4910, 4911, 4912, 4913, 4914, 4915, 4916, 4917, 4918, 4919, 4920, 4921, 4922, 4923, 4924, 4925, 4926, 4927, 4928, 4929, 4930, 4931, 4932, 4933, 4934, 4935, 4936, 4937, 4938, 4939, 4940, 4941, 4942, 4943, 4944, 4945, 4946, 4947, 4948, 4949, 4950, 4951, 4952, 4953, 4954, 4955, 4956, 4957, 4958, 4959, 4960, 4961, 4962, 4963, 4964, 4965, 4966, 4967, 4968, 4969, 4970, 4971, 4972, 4973, 4974, 4975, 4976, 4977, 4978, 4979, 4980, 4981, 4982, 4983, 4984, 4985, 4986, 4987, 4988, 4989, 4990, 4991, 4992, 4993, 4994, 4995, 4996, 4997, 4998, 4999, 5000, 5001, 5002, 5003, 5004, 5005, 5006, 5007, 5008, 5009, 5010, 5011, 5012, 5013, 5014, 5015, 5016, 5017, 5018, 5019, 5020, 5021, 5022, 5023, 5024, 5025, 5026, 5027, 5028, 5029, 5030, 5031, 5032, 5033, 5034, 5035, 5036, 5037, 5038, 5039, 5040, 5041, 5042, 5043, 5044, 5045, 5046, 5047, 5048, 5049, 5050, 5051, 5052, 5053, 5054, 5055, 5056, 5057, 5058, 5059, 5060, 5061, 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, 5072, 5073, 5074, 5075, 5076, 5077, 5078, 5079, 5080, 5081, 5082, 5083, 5084, 5085, 5086, 5087, 5088, 5089, 5090, 5091, 5092, 5093, 5094, 5095, 5096, 5097, 5098, 5099, 5100, 5101, 5102, 5103, 5104, 5105, 5106, 5107, 5108, 5109, 5110, 5111, 5112, 5113, 5114, 5115, 5116, 5117, 5118, 5119, 5120, 5121, 5122, 5123, 5124, 5125, 5126, 5127, 5128, 5129, 5130, 5131, 5132, 5133, 5134, 5135, 5136, 5137, 5138, 5139, 5140, 5141, 5142, 5143, 5144, 5145, 5146, 5147, 5148, 5149, 5150, 5151, 5152, 5153, 5154, 5155, 5156, 5157, 5158, 5159, 5160, 5161, 5162, 5163, 5164, 5165, 5166, 5167, 5168, 5169, 5170, 5171, 5172, 5173, 5174, 5175, 5176, 5177, 5178, 5179, 5180, 5181, 5182, 5183, 5184, 5185, 5186, 5187, 5188, 5189, 5190, 5191, 5192, 5193, 5194, 5195, 5196, 5197, 5198, 5199, 5200, 5201, 5202, 5203, 5204, 5205, 5206, 5207, 5208, 5209, 5210, 5211, 5212, 5213, 5214, 5215, 5216, 5217, 5218, 5219, 5220, 5221, 5222, 5223, 5224, 5225, 5226, 5227, 5228, 5229, 5230, 5231, 5232, 5233, 5234, 5235, 5236, 5237, 5238, 5239, 5240, 5241, 5242, 5243, 5244, 5245, 5246, 5247, 5248, 5249, 5250, 5251, 5252, 5253, 5254, 5255, 5256, 5257, 5258, 5259, 5260, 5261, 5262, 5263, 5264, 5265, 5266, 5267, 5268, 5269, 5270, 5271, 5272, 5273, 5274, 5275, 5276, 5277, 5278, 5279, 5280, 5281, 5282, 5283, 5284, 5285, 5286, 5287, 5288, 5289, 5290, 5291, 5292, 5293, 5294, 5295, 5296, 5297, 5298, 5299, 5300, 5301, 5302, 5303, 5304, 5305, 5306, 5307, 5308, 5309, 5310, 5311, 5312, 5313, 5314, 5315, 5316, 5317, 5318, 5319, 5320, 5321, 5322, 5323, 5324, 5325, 5326, 5327, 5328, 5329, 5330, 5331, 5332, 5333, 5334, 5335, 5336, 5337, 5338, 5339, 5340, 5341, 5342, 5343, 5344, 5345, 5346, 5347, 5348, 5349, 5350, 5351, 5352, 5353, 5354, 5355, 5356, 5357, 5358, 5359, 5360, 5361, 5362, 5363, 5364, 5365, 5366, 5367, 5368, 5369, 5370, 5371, 5372, 5373, 5374, 5375, 5376, 5377, 5378, 5379, 5380, 5381, 5382, 5383, 5384, 5385, 5386, 5387, 5388, 5389, 5390, 5391, 5392, 5393, 5394, 5395, 5396, 5397, 5398, 5399, 5400, 5401, 5402, 5403, 5404, 5405, 5406, 5407, 5408, 5409, 5410, 5411, 5412, 5413, 5414, 5415, 5416, 5417, 5418, 5419, 5420, 5421, 5422, 5423, 5424, 5425, 5426, 5427, 5428, 5429, 5430, 5431, 5432, 5433, 5434, 5435, 5436, 5437, 5438, 5439, 5440, 5441, 5442, 5443, 5444, 5445, 5446, 5447, 5448, 5449, 5450, 5451, 5452, 5453, 5454, 5455, 5456, 5457, 5458, 5459, 5460, 5461, 5462, 5463, 5464, 5465, 5466, 5467, 5468, 5469, 5470, 5471, 5472, 5473, 5474, 5475, 5476, 5477, 5478, 5479, 5480, 5481, 5482, 5483, 5484, 5485, 5486, 5487, 5488, 5489, 5490, 5491, 5492, 5493, 5494, 5495, 5496, 5497, 5498, 5499, 5500, 5501, 5502, 5503, 5504, 5505, 5506, 5507, 5508, 5509, 5510, 5511, 5512, 5513, 5514, 5515, 5516, 5517, 5518, 5519, 5520, 5521, 5522, 5523, 5524, 5525, 5526, 5527, 5528, 5529, 5530, 5531, 5532, 5533, 5534, 5535, 5536, 5537, 5538, 5539, 5540, 5541, 5542, 5543, 5544, 5545, 5546, 5547, 5548, 5549, 5550, 5551, 5552, 5553, 5554, 5555, 5556, 5557, 5558, 5559, 5560, 5561, 5562, 5563, 5564, 5565, 5566, 5567, 5568, 5569, 5570, 5571, 5572, 5573, 5574, 5575, 5576, 5577, 5578, 5579, 5580, 5581, 5582, 5583, 5584, 5585, 5586, 5587, 5588, 5589, 5590, 5591, 5592, 5593, 5594, 5595, 5596, 5597, 5598, 5599, 5600, 5601, 5602, 5603, 5604, 5605, 5606, 5607, 5608, 5609, 5610, 5611, 5612, 5613, 5614, 5615, 5616, 5617, 5618, 5619, 5620, 5621, 5622, 5623, 5624, 5625, 5626, 5627, 5628, 5629, 5630, 5631, 5632, 5633, 5634, 5635, 5636, 5637, 5638, 5639, 5640, 5641, 5642, 5643, 5644, 5645, 5646, 5647, 5648, 5649, 5650, 5651, 5652, 5653, 5654, 5655, 5656, 5657, 5658, 5659, 5660, 5661, 5662, 5663, 5664, 5665, 5666, 5667, 5668, 5669, 5670, 5671, 5672, 5673, 5674, 5675, 5676, 5677, 5678, 5679, 5680, 5681, 5682, 5683, 5684, 5685, 5686, 5687, 5688, 5689, 5690, 5691, 5692, 5693, 5694, 5695, 5696, 5697, 5698, 5699, 5700, 5701, 5702, 5703, 5704, 5705, 5706, 5707, 5708, 5709, 5710, 5711, 5712, 5713, 5714, 5715, 5716, 5717, 5718, 5719, 5720, 5721, 5722, 5723, 5724, 5725, 5726, 5727, 5728, 5729, 5730, 5731, 5732, 5733, 5734, 5735, 5736, 5737, 5738, 5739, 5740, 5741, 5742, 5743, 5744, 5745, 5746, 5747, 5748, 5749, 5750, 5751, 5752, 5753, 5754, 5755, 5756, 5757, 5758, 5759, 5760, 5761, 5762, 5763, 5764, 5765, 5766, 5767, 5768, 5769, 5770, 5771, 5772, 5773, 5774, 5775, 5776, 5777, 5778, 5779, 5780, 5781, 5782, 5783, 5784, 5785, 5786, 5787, 5788, 5789, 5790, 5791, 5792, 5793, 5794, 5795, 5796, 5797, 5798, 5799, 5800, 5801, 5802, 5803, 5804, 5805, 5806, 5807, 5808, 5809, 5810, 5811, 5812, 5813, 5814, 5815, 5816, 5817, 5818, 5819, 5820, 5821, 5822, 5823, 5824, 5825, 5826, 5827, 5828, 5829, 5830, 5831, 5832, 5833, 5834, 5835, 5836, 5837, 5838, 5839, 5840, 5841, 5842, 5843, 5844, 5845, 5846, 5847, 5848, 5849, 5850, 5851, 5852, 5853, 5854, 5855, 5856, 5857, 5858, 5859, 5860, 5861, 5862, 5863, 5864, 5865, 5866, 5867, 5868, 5869, 5870, 5871, 5872, 5873, 5874, 5875, 5876, 5877, 5878, 5879, 5880, 5881, 5882, 5883, 5884, 5885, 5886, 5887, 5888, 5889, 5890, 5891, 5892, 5893, 5894, 5895, 5896, 5897, 5898, 5899, 5900, 5901, 5902, 5903, 5904, 5905, 5906, 5907, 5908, 5909, 5910, 5911, 5912, 5913, 5914, 5915, 5916, 5917, 5918, 5919, 5920, 5921, 5922, 5923, 5924, 5925, 5926, 5927, 5928, 5929, 5930, 5931, 5932, 5933, 5934, 5935, 5936, 5937, 5938, 5939, 5940, 5941, 5942, 5943, 5944, 5945, 5946, 5947, 5948, 5949, 5950, 5951, 5952, 5953, 5954, 5955, 5956, 5957, 5958, 5959, 5960, 5961, 5962, 5963, 5964, 5965, 5966, 5967, 5968, 5969, 5970, 5971, 5972, 5973, 5974, 5975, 5976, 5977, 5978, 5979, 5980, 5981, 5982, 5983, 5984, 5985, 5986, 5987, 5988, 5989, 5990, 5991, 5992, 5993, 5994, 5995, 5996, 5997, 5998, 5999, 6000, 6001, 6002, 6003, 6004, 6005, 6006, 6007, 6008, 6009, 6010, 6011, 6012, 6013, 6014, 6015, 6016, 6017, 6018, 6019, 6020, 6021, 6022, 6023, 6024, 6025, 6026, 6027, 6028, 6029, 6030, 6031, 6032, 6033, 6034, 6035, 6036, 6037, 6038, 6039, 6040, 6041, 6042, 6043, 6044, 6045, 6046, 6047, 6048, 6049, 6050, 6051, 6052, 6053, 6054, 6055, 6056, 6057, 6058, 6059, 6060, 6061, 6062, 6063, 6064, 6065, 6066, 6067, 6068, 6069, 6070, 6071, 6072, 6073, 6074, 6075, 6076, 6077, 6078, 6079, 6080, 6081, 6082, 6083, 6084, 6085, 6086, 6087, 6088, 6089, 6090, 6091, 6092, 6093, 6094, 6095, 6096, 6097, 6098, 6099, 6100, 6101, 6102, 6103, 6104, 6105, 6106, 6107, 6108, 6109, 6110, 6111, 6112, 6113, 6114, 6115, 6116, 6117, 6118, 6119, 6120, 6121, 6122, 6123, 6124, 6125, 6126, 6127, 6128, 6129, 6130, 6131, 6132, 6133, 6134, 6135, 6136, 6137, 6138, 6139, 6140, 6141, 6142, 6143, 6144, 6145, 6146, 6147, 6148, 6149, 6150, 6151, 6152, 6153, 6154, 6155, 6156, 6157, 6158, 6159, 6160, 6161, 6162, 6163, 6164, 6165, 6166, 6167, 6168, 6169, 6170, 6171, 6172, 6173, 6174, 6175, 6176, 6177, 6178, 6179, 6180, 6181, 6182, 6183, 6184, 6185, 6186, 6187, 6188, 6189, 6190, 6191, 6192, 6193, 6194, 6195, 6196, 6197, 6198, 6199, 6200, 6201, 6202, 6203, 6204, 6205, 6206, 6207, 6208, 6209, 6210, 6211, 6212, 6213, 6214, 6215, 6216, 6217, 6218, 6219, 6220, 6221, 6222, 6223, 6224, 6225, 6226, 6227, 6228, 6229, 6230, 6231, 6232, 6233, 6234, 6235, 6236, 6237, 6238, 6239, 6240, 6241, 6242, 6243, 6244, 6245, 6246, 6247, 6248, 6249, 6250, 6251, 6252, 6253, 6254, 6255, 6256, 6257, 6258, 6259, 6260, 6261, 6262, 6263, 6264, 6265, 6266, 6267, 6268, 6269, 6270, 6271, 6272, 6273, 6274, 6275, 6276, 6277, 6278, 6279, 6280, 6281, 6282, 6283, 6284, 6285, 6286, 6287, 6288, 6289, 6290, 6291, 6292, 6293, 6294, 6295, 6296, 6297, 6298, 6299, 6300, 6301, 6302, 6303, 6304, 6305, 6306, 6307, 6308, 6309, 6310, 6311, 6312, 6313, 6314, 6315, 6316, 6317, 6318, 6319, 6320, 6321, 6322, 6323, 6324, 6325, 6326, 6327, 6328, 6329, 6330, 6331, 6332, 6333, 6334, 6335, 6336, 6337, 6338, 6339, 6340, 6341, 6342, 6343, 6344, 6345, 6346, 6347, 6348, 6349, 6350, 6351, 6352, 6353, 6354, 6355, 6356, 6357, 6358, 6359, 6360, 6361, 6362, 6363, 6364, 6365, 6366, 6367, 6368, 6369, 6370, 6371, 6372, 6373, 6374, 6375, 6376, 6377, 6378, 6379, 6380, 6381, 6382, 6383, 6384, 6385, 6386, 6387, 6388, 6389, 6390, 6391, 6392, 6393, 6394, 6395, 6396, 6397, 6398, 6399, 6400, 6401, 6402, 6403, 6404, 6405, 6406, 6407, 6408, 6409, 6410, 6411, 6412, 6413, 6414, 6415, 6416, 6417, 6418, 6419, 6420, 6421, 6422, 6423, 6424, 6425, 6426, 6427, 6428, 6429, 6430, 6431, 6432, 6433, 6434, 6435, 6436, 6437, 6438, 6439, 6440, 6441, 6442, 6443, 6444, 6445, 6446, 6447, 6448, 6449, 6450, 6451, 6452, 6453, 6454, 6455, 6456, 6457, 6458, 6459, 6460, 6461, 6462, 6463, 6464, 6465, 6466, 6467, 6468, 6469, 6470, 6471, 6472, 6473, 6474, 6475, 6476, 6477, 6478, 6479, 6480, 6481, 6482, 6483, 6484, 6485, 6486, 6487, 6488, 6489, 6490, 6491, 6492, 6493, 6494, 6495, 6496, 6497, 6498, 6499, 6500, 6501, 6502, 6503, 6504, 6505, 6506, 6507, 6508, 6509, 6510, 6511, 6512, 6513, 6514, 6515, 6516, 6517, 6518, 6519, 6520, 6521, 6522, 6523, 6524, 6525, 6526, 6527, 6528, 6529, 6530, 6531, 6532, 6533, 6534, 6535, 6536, 6537, 6538, 6539, 6540, 6541, 6542, 6543, 6544, 6545, 6546, 6547, 6548, 6549, 6550, 6551, 6552, 6553, 6554, 6555, 6556, 6557, 6558, 6559, 6560, 6561, 6562, 6563, 6564, 6565, 6566, 6567, 6568, 6569, 6570, 6571, 6572, 6573, 6574, 6575, 6576, 6577, 6578, 6579, 6580, 6581, 6582, 6583, 6584, 6585, 6586, 6587, 6588, 6589, 6590, 6591, 6592, 6593, 6594, 6595, 6596, 6597, 6598, 6599, 6600, 6601, 6602, 6603, 6604, 6605, 6606, 6607, 6608, 6609, 6610, 6611, 6612, 6613, 6614, 6615, 6616, 6617, 6618, 6619, 6620, 6621, 6622, 6623, 6624, 6625, 6626, 6627, 6628, 6629, 6630, 6631, 6632, 6633, 6634, 6635, 6636, 6637, 6638, 6639, 6640, 6641, 6642, 6643, 6644, 6645, 6646, 6647, 6648, 6649, 6650, 6651, 6652, 6653, 6654, 6655, 6656, 6657, 6658, 6659, 6660, 6661, 6662, 6663, 6664, 6665, 6666, 6667, 6668, 6669, 6670, 6671, 6672, 6673, 6674, 6675, 6676, 6677, 6678, 6679, 6680, 6681, 6682, 6683, 6684, 6685, 6686, 6687, 6688, 6689, 6690, 6691, 6692, 6693, 6694, 6695, 6696, 6697, 6698, 6699, 6700, 6701, 6702, 6703, 6704, 6705, 6706, 6707, 6708, 6709, 6710, 6711, 6712, 6713, 6714, 6715, 6716, 6717, 6718, 6719, 6720, 6721, 6722, 6723, 6724, 6725, 6726, 6727, 6728, 6729, 6730, 6731, 6732, 6733, 6734, 6735, 6736, 6737, 6738, 6739, 6740, 6741, 6742, 6743, 6744, 6745, 6746, 6747, 6748, 6749, 6750, 6751, 6752, 6753, 6754, 6755, 6756, 6757, 6758, 6759, 6760, 6761, 6762, 6763, 6764, 6765, 6766, 6767, 6768, 6769, 6770, 6771, 6772, 6773, 6774, 6775, 6776, 6777, 6778, 6779, 6780, 6781, 6782, 6783, 6784, 6785, 6786, 6787, 6788, 6789, 6790, 6791, 6792, 6793, 6794, 6795, 6796, 6797, 6798, 6799, 6800, 6801, 6802, 6803, 6804, 6805, 6806, 6807, 6808, 6809, 6810, 6811, 6812, 6813, 6814, 6815, 6816, 6817, 6818, 6819, 6820, 6821, 6822, 6823, 6824, 6825, 6826, 6827, 6828, 6829, 6830, 6831, 6832, 6833, 6834, 6835, 6836, 6837, 6838, 6839, 6840, 6841, 6842, 6843, 6844, 6845, 6846, 6847, 6848, 6849, 6850, 6851, 6852, 6853, 6854, 6855, 6856, 6857, 6858, 6859, 6860, 6861, 6862, 6863, 6864, 6865, 6866, 6867, 6868, 6869, 6870, 6871, 6872, 6873, 6874, 6875, 6876, 6877, 6878, 6879, 6880, 6881, 6882, 6883, 6884, 6885, 6886, 6887, 6888, 6889, 6890, 6891, 6892, 6893, 6894, 6895, 6896, 6897, 6898, 6899, 6900, 6901, 6902, 6903, 6904, 6905, 6906, 6907, 6908, 6909, 6910, 6911, 6912, 6913, 6914, 6915, 6916, 6917, 6918, 6919, 6920, 6921, 6922, 6923, 6924, 6925, 6926, 6927, 6928, 6929, 6930, 6931, 6932, 6933, 6934, 6935, 6936, 6937, 6938, 6939, 6940, 6941, 6942, 6943, 6944, 6945, 6946, 6947, 6948, 6949, 6950, 6951, 6952, 6953, 6954, 6955, 6956, 6957, 6958, 6959, 6960, 6961, 6962, 6963, 6964, 6965, 6966, 6967, 6968, 6969, 6970, 6971, 6972, 6973, 6974, 6975, 6976, 6977, 6978, 6979, 6980, 6981, 6982, 6983, 6984, 6985, 6986, 6987, 6988, 6989, 6990, 6991, 6992, 6993, 6994, 6995, 6996, 6997, 6998, 6999, 7000, 7001, 7002, 7003, 7004, 7005, 7006, 7007, 7008, 7009, 7010, 7011, 7012, 7013, 7014, 7015, 7016, 7017, 7018, 7019, 7020, 7021, 7022, 7023, 7024, 7025, 7026, 7027, 7028, 7029, 7030, 7031, 7032, 7033, 7034, 7035, 7036, 7037, 7038, 7039, 7040, 7041, 7042, 7043, 7044, 7045, 7046, 7047, 7048, 7049, 7050, 7051, 7052, 7053, 7054, 7055, 7056, 7057, 7058, 7059, 7060, 7061, 7062, 7063, 7064, 7065, 7066, 7067, 7068, 7069, 7070, 7071, 7072, 7073, 7074, 7075, 7076, 7077, 7078, 7079, 7080, 7081, 7082, 7083, 7084, 7085, 7086, 7087, 7088, 7089, 7090, 7091, 7092, 7093, 7094, 7095, 7096, 7097, 7098, 7099, 7100, 7101, 7102, 7103, 7104, 7105, 7106, 7107, 7108, 7109, 7110, 7111, 7112, 7113, 7114, 7115, 7116, 7117, 7118, 7119, 7120, 7121, 7122, 7123, 7124, 7125, 7126, 7127, 7128, 7129, 7130, 7131, 7132, 7133, 7134, 7135, 7136, 7137, 7138, 7139, 7140, 7141, 7142, 7143, 7144, 7145, 7146, 7147, 7148, 7149, 7150, 7151, 7152, 7153, 7154, 7155, 7156, 7157, 7158, 7159, 7160, 7161, 7162, 7163, 7164, 7165, 7166, 7167, 7168, 7169, 7170, 7171, 7172, 7173, 7174, 7175, 7176, 7177, 7178, 7179, 7180, 7181, 7182, 7183, 7184, 7185, 7186, 7187, 7188, 7189, 7190, 7191, 7192, 7193, 7194, 7195, 7196, 7197, 7198, 7199, 7200, 7201, 7202, 7203, 7204, 7205, 7206, 7207, 7208, 7209, 7210, 7211, 7212, 7213, 7214, 7215, 7216, 7217, 7218, 7219, 7220, 7221, 7222, 7223, 7224, 7225, 7226, 7227, 7228, 7229, 7230, 7231, 7232, 7233, 7234, 7235, 7236, 7237, 7238, 7239, 7240, 7241, 7242, 7243, 7244, 7245, 7246, 7247, 7248, 7249, 7250, 7251, 7252, 7253, 7254, 7255, 7256, 7257, 7258, 7259, 7260, 7261, 7262, 7263, 7264, 7265, 7266, 7267, 7268, 7269, 7270, 7271, 7272, 7273, 7274, 7275, 7276, 7277, 7278, 7279, 7280, 7281, 7282, 7283, 7284, 7285, 7286, 7287, 7288, 7289, 7290, 7291, 7292, 7293, 7294, 7295, 7296, 7297, 7298, 7299, 7300, 7301, 7302, 7303, 7304, 7305, 7306, 7307, 7308, 7309, 7310, 7311, 7312, 7313, 7314, 7315, 7316, 7317, 7318, 7319, 7320, 7321, 7322, 7323, 7324, 7325, 7326, 7327, 7328, 7329, 7330, 7331, 7332, 7333, 7334, 7335, 7336, 7337, 7338, 7339, 7340, 7341, 7342, 7343, 7344, 7345, 7346, 7347, 7348, 7349, 7350, 7351, 7352, 7353, 7354, 7355, 7356, 7357, 7358, 7359, 7360, 7361, 7362, 7363, 7364, 7365, 7366, 7367, 7368, 7369, 7370, 7371, 7372, 7373, 7374, 7375, 7376, 7377, 7378, 7379, 7380, 7381, 7382, 7383, 7384, 7385, 7386, 7387, 7388, 7389, 7390, 7391, 7392, 7393, 7394, 7395, 7396, 7397, 7398, 7399, 7400, 7401, 7402, 7403, 7404, 7405, 7406, 7407, 7408, 7409, 7410, 7411, 7412, 7413, 7414, 7415, 7416, 7417, 7418, 7419, 7420, 7421, 7422, 7423, 7424, 7425, 7426, 7427, 7428, 7429, 7430, 7431, 7432, 7433, 7434, 7435, 7436, 7437, 7438, 7439, 7440, 7441, 7442, 7443, 7444, 7445, 7446, 7447, 7448, 7449, 7450, 7451, 7452, 7453, 7454, 7455, 7456, 7457, 7458, 7459, 7460, 7461, 7462, 7463, 7464, 7465, 7466, 7467, 7468, 7469, 7470, 7471, 7472, 7473, 7474, 7475, 7476, 7477, 7478, 7479, 7480, 7481, 7482, 7483, 7484, 7485, 7486, 7487, 7488, 7489, 7490, 7491, 7492, 7493, 7494, 7495, 7496, 7497, 7498, 7499, 7500, 7501, 7502, 7503, 7504, 7505, 7506, 7507, 7508, 7509, 7510, 7511, 7512, 7513, 7514, 7515, 7516, 7517, 7518, 7519, 7520, 7521, 7522, 7523, 7524, 7525, 7526, 7527, 7528, 7529, 7530, 7531, 7532, 7533, 7534, 7535, 7536, 7537, 7538, 7539, 7540, 7541, 7542, 7543, 7544, 7545, 7546, 7547, 7548, 7549, 7550, 7551, 7552, 7553, 7554, 7555, 7556, 7557, 7558, 7559, 7560, 7561, 7562, 7563, 7564, 7565, 7566, 7567, 7568, 7569, 7570, 7571, 7572, 7573, 7574, 7575, 7576, 7577, 7578, 7579, 7580, 7581, 7582, 7583, 7584, 7585, 7586, 7587, 7588, 7589, 7590, 7591, 7592, 7593, 7594, 7595, 7596, 7597, 7598, 7599, 7600, 7601, 7602, 7603, 7604, 7605, 7606, 7607, 7608, 7609, 7610, 7611, 7612, 7613, 7614, 7615, 7616, 7617, 7618, 7619, 7620, 7621, 7622, 7623, 7624, 7625, 7626, 7627, 7628, 7629, 7630, 7631, 7632, 7633, 7634, 7635, 7636, 7637, 7638, 7639, 7640, 7641, 7642, 7643, 7644, 7645, 7646, 7647, 7648, 7649, 7650, 7651, 7652, 7653, 7654, 7655, 7656, 7657, 7658, 7659, 7660, 7661, 7662, 7663, 7664, 7665, 7666, 7667, 7668, 7669, 7670, 7671, 7672, 7673, 7674, 7675, 7676, 7677, 7678, 7679, 7680, 7681, 7682, 7683, 7684, 7685, 7686, 7687, 7688, 7689, 7690, 7691, 7692, 7693, 7694, 7695, 7696, 7697, 7698, 7699, 7700, 7701, 7702, 7703, 7704, 7705, 7706, 7707, 7708, 7709, 7710, 7711, 7712, 7713, 7714, 7715, 7716, 7717, 7718, 7719, 7720, 7721, 7722, 7723, 7724, 7725, 7726, 7727, 7728, 7729, 7730, 7731, 7732, 7733, 7734, 7735, 7736, 7737, 7738, 7739, 7740, 7741, 7742, 7743, 7744, 7745, 7746, 7747, 7748, 7749, 7750, 7751, 7752, 7753, 7754, 7755, 7756, 7757, 7758, 7759, 7760, 7761, 7762, 7763, 7764, 7765, 7766, 7767, 7768, 7769, 7770, 7771, 7772, 7773, 7774, 7775, 7776, 7777, 7778, 7779, 7780, 7781, 7782, 7783, 7784, 7785, 7786, 7787, 7788, 7789, 7790, 7791, 7792, 7793, 7794, 7795, 7796, 7797, 7798, 7799, 7800, 7801, 7802, 7803, 7804, 7805, 7806, 7807, 7808, 7809, 7810, 7811, 7812, 7813, 7814, 7815, 7816, 7817, 7818, 7819, 7820, 7821, 7822, 7823, 7824, 7825, 7826, 7827, 7828, 7829, 7830, 7831, 7832, 7833, 7834, 7835, 7836, 7837, 7838, 7839, 7840, 7841, 7842, 7843, 7844, 7845, 7846, 7847, 7848, 7849, 7850, 7851, 7852, 7853, 7854, 7855, 7856, 7857, 7858, 7859, 7860, 7861, 7862, 7863, 7864, 7865, 7866, 7867, 7868, 7869, 7870, 7871, 7872, 7873, 7874, 7875, 7876, 7877, 7878, 7879, 7880, 7881, 7882, 7883, 7884, 7885, 7886, 7887, 7888, 7889, 7890, 7891, 7892, 7893, 7894, 7895, 7896, 7897, 7898, 7899, 7900, 7901, 7902, 7903, 7904, 7905, 7906, 7907, 7908, 7909, 7910, 7911, 7912, 7913, 7914, 7915, 7916, 7917, 7918, 7919, 7920, 7921, 7922, 7923, 7924, 7925, 7926, 7927, 7928, 7929, 7930, 7931, 7932, 7933, 7934, 7935, 7936, 7937, 7938, 7939, 7940, 7941, 7942, 7943, 7944, 7945, 7946, 7947, 7948, 7949, 7950, 7951, 7952, 7953, 7954, 7955, 7956, 7957, 7958, 7959, 7960, 7961, 7962, 7963, 7964, 7965, 7966, 7967, 7968, 7969, 7970, 7971, 7972, 7973, 7974, 7975, 7976, 7977, 7978, 7979, 7980, 7981, 7982, 7983, 7984, 7985, 7986, 7987, 7988, 7989, 7990, 7991, 7992, 7993, 7994, 7995, 7996, 7997, 7998, 7999, 8000, 8001, 8002, 8003, 8004, 8005, 8006, 8007, 8008, 8009, 8010, 8011, 8012, 8013, 8014, 8015, 8016, 8017, 8018, 8019, 8020, 8021, 8022, 8023, 8024, 8025, 8026, 8027, 8028, 8029, 8030, 8031, 8032, 8033, 8034, 8035, 8036, 8037, 8038, 8039, 8040, 8041, 8042, 8043, 8044, 8045, 8046, 8047, 8048, 8049, 8050, 8051, 8052, 8053, 8054, 8055, 8056, 8057, 8058, 8059, 8060, 8061, 8062, 8063, 8064, 8065, 8066, 8067, 8068, 8069, 8070, 8071, 8072, 8073, 8074, 8075, 8076, 8077, 8078, 8079, 8080, 8081, 8082, 8083, 8084, 8085, 8086, 8087, 8088, 8089, 8090, 8091, 8092, 8093, 8094, 8095, 8096, 8097, 8098, 8099, 8100, 8101, 8102, 8103, 8104, 8105, 8106, 8107, 8108, 8109, 8110, 8111, 8112, 8113, 8114, 8115, 8116, 8117, 8118, 8119, 8120, 8121, 8122, 8123, 8124, 8125, 8126, 8127, 8128, 8129, 8130, 8131, 8132, 8133, 8134, 8135, 8136, 8137, 8138, 8139, 8140, 8141, 8142, 8143, 8144, 8145, 8146, 8147, 8148, 8149, 8150, 8151, 8152, 8153, 8154, 8155, 8156, 8157, 8158, 8159, 8160, 8161, 8162, 8163, 8164, 8165, 8166, 8167, 8168, 8169, 8170, 8171, 8172, 8173, 8174, 8175, 8176, 8177, 8178, 8179, 8180, 8181, 8182, 8183, 8184, 8185, 8186, 8187, 8188, 8189, 8190, 8191, 8192, 8193, 8194, 8195, 8196, 8197, 8198, 8199, 8200, 8201, 8202, 8203, 8204, 8205, 8206, 8207, 8208, 8209, 8210, 8211, 8212, 8213, 8214, 8215, 8216, 8217, 8218, 8219, 8220, 8221, 8222, 8223, 8224, 8225, 8226, 8227, 8228, 8229, 8230, 8231, 8232, 8233, 8234, 8235, 8236, 8237, 8238, 8239, 8240, 8241, 8242, 8243, 8244, 8245, 8246, 8247, 8248, 8249, 8250, 8251, 8252, 8253, 8254, 8255, 8256, 8257, 8258, 8259, 8260, 8261, 8262, 8263, 8264, 8265, 8266, 8267, 8268, 8269, 8270, 8271, 8272, 8273, 8274, 8275, 8276, 8277, 8278, 8279, 8280, 8281, 8282, 8283, 8284, 8285, 8286, 8287, 8288, 8289, 8290, 8291, 8292, 8293, 8294, 8295, 8296, 8297, 8298, 8299, 8300, 8301, 8302, 8303, 8304, 8305, 8306, 8307, 8308, 8309, 8310, 8311, 8312, 8313, 8314, 8315, 8316, 8317, 8318, 8319, 8320, 8321, 8322, 8323, 8324, 8325, 8326, 8327, 8328, 8329, 8330, 8331, 8332, 8333, 8334, 8335, 8336, 8337, 8338, 8339, 8340, 8341, 8342, 8343, 8344, 8345, 8346, 8347, 8348, 8349, 8350, 8351, 8352, 8353, 8354, 8355, 8356, 8357, 8358, 8359, 8360, 8361, 8362, 8363, 8364, 8365, 8366, 8367, 8368, 8369, 8370, 8371, 8372, 8373, 8374, 8375, 8376, 8377, 8378, 8379, 8380, 8381, 8382, 8383, 8384, 8385, 8386, 8387, 8388, 8389, 8390, 8391, 8392, 8393, 8394, 8395, 8396, 8397, 8398, 8399, 8400, 8401, 8402, 8403, 8404, 8405, 8406, 8407, 8408, 8409, 8410, 8411, 8412, 8413, 8414, 8415, 8416, 8417, 8418, 8419, 8420, 8421, 8422, 8423, 8424, 8425, 8426, 8427, 8428, 8429, 8430, 8431, 8432, 8433, 8434, 8435, 8436, 8437, 8438, 8439, 8440, 8441, 8442, 8443, 8444, 8445, 8446, 8447, 8448, 8449, 8450, 8451, 8452, 8453, 8454, 8455, 8456, 8457, 8458, 8459, 8460, 8461, 8462, 8463, 8464, 8465, 8466, 8467, 8468, 8469, 8470, 8471, 8472, 8473, 8474, 8475, 8476, 8477, 8478, 8479, 8480, 8481, 8482, 8483, 8484, 8485, 8486, 8487, 8488, 8489, 8490, 8491, 8492, 8493, 8494, 8495, 8496, 8497, 8498, 8499, 8500, 8501, 8502, 8503, 8504, 8505, 8506, 8507, 8508, 8509, 8510, 8511, 8512, 8513, 8514, 8515, 8516, 8517, 8518, 8519, 8520, 8521, 8522, 8523, 8524, 8525, 8526, 8527, 8528, 8529, 8530, 8531, 8532, 8533, 8534, 8535, 8536, 8537, 8538, 8539, 8540, 8541, 8542, 8543, 8544, 8545, 8546, 8547, 8548, 8549, 8550, 8551, 8552, 8553, 8554, 8555, 8556, 8557, 8558, 8559, 8560, 8561, 8562, 8563, 8564, 8565, 8566, 8567, 8568, 8569, 8570, 8571, 8572, 8573, 8574, 8575, 8576, 8577, 8578, 8579, 8580, 8581, 8582, 8583, 8584, 8585, 8586, 8587, 8588, 8589, 8590, 8591, 8592, 8593, 8594, 8595, 8596, 8597, 8598, 8599, 8600, 8601, 8602, 8603, 8604, 8605, 8606, 8607, 8608, 8609, 8610, 8611, 8612, 8613, 8614, 8615, 8616, 8617, 8618, 8619, 8620, 8621, 8622, 8623, 8624, 8625, 8626, 8627, 8628, 8629, 8630, 8631, 8632, 8633, 8634, 8635, 8636, 8637, 8638, 8639, 8640, 8641, 8642, 8643, 8644, 8645, 8646, 8647, 8648, 8649, 8650, 8651, 8652, 8653, 8654, 8655, 8656, 8657, 8658, 8659, 8660, 8661, 8662, 8663, 8664, 8665, 8666, 8667, 8668, 8669, 8670, 8671, 8672, 8673, 8674, 8675, 8676, 8677, 8678, 8679, 8680, 8681, 8682, 8683, 8684, 8685, 8686, 8687, 8688, 8689, 8690, 8691, 8692, 8693, 8694, 8695, 8696, 8697, 8698, 8699, 8700, 8701, 8702, 8703, 8704, 8705, 8706, 8707, 8708, 8709, 8710, 8711, 8712, 8713, 8714, 8715, 8716, 8717, 8718, 8719, 8720, 8721, 8722, 8723, 8724, 8725, 8726, 8727, 8728, 8729, 8730, 8731, 8732, 8733, 8734, 8735, 8736, 8737, 8738, 8739, 8740, 8741, 8742, 8743, 8744, 8745, 8746, 8747, 8748, 8749, 8750, 8751, 8752, 8753, 8754, 8755, 8756, 8757, 8758, 8759, 8760, 8761, 8762, 8763, 8764, 8765, 8766, 8767, 8768, 8769, 8770, 8771, 8772, 8773, 8774, 8775, 8776, 8777, 8778, 8779, 8780, 8781, 8782, 8783, 8784, 8785, 8786, 8787, 8788, 8789, 8790, 8791, 8792, 8793, 8794, 8795, 8796, 8797, 8798, 8799, 8800, 8801, 8802, 8803, 8804, 8805, 8806, 8807, 8808, 8809, 8810, 8811, 8812, 8813, 8814, 8815, 8816, 8817, 8818, 8819, 8820, 8821, 8822, 8823, 8824, 8825, 8826, 8827, 8828, 8829, 8830, 8831, 8832, 8833, 8834, 8835, 8836, 8837, 8838, 8839, 8840, 8841, 8842, 8843, 8844, 8845, 8846, 8847, 8848, 8849, 8850, 8851, 8852, 8853, 8854, 8855, 8856, 8857, 8858, 8859, 8860, 8861, 8862, 8863, 8864, 8865, 8866, 8867, 8868, 8869, 8870, 8871, 8872, 8873, 8874, 8875, 8876, 8877, 8878, 8879, 8880, 8881, 8882, 8883, 8884, 8885, 8886, 8887, 8888, 8889, 8890, 8891, 8892, 8893, 8894, 8895, 8896, 8897, 8898, 8899, 8900, 8901, 8902, 8903, 8904, 8905, 8906, 8907, 8908, 8909, 8910, 8911, 8912, 8913, 8914, 8915, 8916, 8917, 8918, 8919, 8920, 8921, 8922, 8923, 8924, 8925, 8926, 8927, 8928, 8929, 8930, 8931, 8932, 8933, 8934, 8935, 8936, 8937, 8938, 8939, 8940, 8941, 8942, 8943, 8944, 8945, 8946, 8947, 8948, 8949, 8950, 8951, 8952, 8953, 8954, 8955, 8956, 8957, 8958, 8959, 8960, 8961, 8962, 8963, 8964, 8965, 8966, 8967, 8968, 8969, 8970, 8971, 8972, 8973, 8974, 8975, 8976, 8977, 8978, 8979, 8980, 8981, 8982, 8983, 8984, 8985, 8986, 8987, 8988, 8989, 8990, 8991, 8992, 8993, 8994, 8995, 8996, 8997, 8998, 8999, 9000, 9001, 9002, 9003, 9004, 9005, 9006, 9007, 9008, 9009, 9010, 9011, 9012, 9013, 9014, 9015, 9016, 9017, 9018, 9019, 9020, 9021, 9022, 9023, 9024, 9025, 9026, 9027, 9028, 9029, 9030, 9031, 9032, 9033, 9034, 9035, 9036, 9037, 9038, 9039, 9040, 9041, 9042, 9043, 9044, 9045, 9046, 9047, 9048, 9049, 9050, 9051, 9052, 9053, 9054, 9055, 9056, 9057, 9058, 9059, 9060, 9061, 9062, 9063, 9064, 9065, 9066, 9067, 9068, 9069, 9070, 9071, 9072, 9073, 9074, 9075, 9076, 9077, 9078, 9079, 9080, 9081, 9082, 9083, 9084, 9085, 9086, 9087, 9088, 9089, 9090, 9091, 9092, 9093, 9094, 9095, 9096, 9097, 9098, 9099, 9100, 9101, 9102, 9103, 9104, 9105, 9106, 9107, 9108, 9109, 9110, 9111, 9112, 9113, 9114, 9115, 9116, 9117, 9118, 9119, 9120, 9121, 9122, 9123, 9124, 9125, 9126, 9127, 9128, 9129, 9130, 9131, 9132, 9133, 9134, 9135, 9136, 9137, 9138, 9139, 9140, 9141, 9142, 9143, 9144, 9145, 9146, 9147, 9148, 9149, 9150, 9151, 9152, 9153, 9154, 9155, 9156, 9157, 9158, 9159, 9160, 9161, 9162, 9163, 9164, 9165, 9166, 9167, 9168, 9169, 9170, 9171, 9172, 9173, 9174, 9175, 9176, 9177, 9178, 9179, 9180, 9181, 9182, 9183, 9184, 9185, 9186, 9187, 9188, 9189, 9190, 9191, 9192, 9193, 9194, 9195, 9196, 9197, 9198, 9199, 9200, 9201, 9202, 9203, 9204, 9205, 9206, 9207, 9208, 9209, 9210, 9211, 9212, 9213, 9214, 9215, 9216, 9217, 9218, 9219, 9220, 9221, 9222, 9223, 9224, 9225, 9226, 9227, 9228, 9229, 9230, 9231, 9232, 9233, 9234, 9235, 9236, 9237, 9238, 9239, 9240, 9241, 9242, 9243, 9244, 9245, 9246, 9247, 9248, 9249, 9250, 9251, 9252, 9253, 9254, 9255, 9256, 9257, 9258, 9259, 9260, 9261, 9262, 9263, 9264, 9265, 9266, 9267, 9268, 9269, 9270, 9271, 9272, 9273, 9274, 9275, 9276, 9277, 9278, 9279, 9280, 9281, 9282, 9283, 9284, 9285, 9286, 9287, 9288, 9289, 9290, 9291, 9292, 9293, 9294, 9295, 9296, 9297, 9298, 9299, 9300, 9301, 9302, 9303, 9304, 9305, 9306, 9307, 9308, 9309, 9310, 9311, 9312, 9313, 9314, 9315, 9316, 9317, 9318, 9319, 9320, 9321, 9322, 9323, 9324, 9325, 9326, 9327, 9328, 9329, 9330, 9331, 9332, 9333, 9334, 9335, 9336, 9337, 9338, 9339, 9340, 9341, 9342, 9343, 9344, 9345, 9346, 9347, 9348, 9349, 9350, 9351, 9352, 9353, 9354, 9355, 9356, 9357, 9358, 9359, 9360, 9361, 9362, 9363, 9364, 9365, 9366, 9367, 9368, 9369, 9370, 9371, 9372, 9373, 9374, 9375, 9376, 9377, 9378, 9379, 9380, 9381, 9382, 9383, 9384, 9385, 9386, 9387, 9388, 9389, 9390, 9391, 9392, 9393, 9394, 9395, 9396, 9397, 9398, 9399, 9400, 9401, 9402, 9403, 9404, 9405, 9406, 9407, 9408, 9409, 9410, 9411, 9412, 9413, 9414, 9415, 9416, 9417, 9418, 9419, 9420, 9421, 9422, 9423, 9424, 9425, 9426, 9427, 9428, 9429, 9430, 9431, 9432, 9433, 9434, 9435, 9436, 9437, 9438, 9439, 9440, 9441, 9442, 9443, 9444, 9445, 9446, 9447, 9448, 9449, 9450, 9451, 9452, 9453, 9454, 9455, 9456, 9457, 9458, 9459, 9460, 9461, 9462, 9463, 9464, 9465, 9466, 9467, 9468, 9469, 9470, 9471, 9472, 9473, 9474, 9475, 9476, 9477, 9478, 9479, 9480, 9481, 9482, 9483, 9484, 9485, 9486, 9487, 9488, 9489, 9490, 9491, 9492, 9493, 9494, 9495, 9496, 9497, 9498, 9499, 9500, 9501, 9502, 9503, 9504, 9505, 9506, 9507, 9508, 9509, 9510, 9511, 9512, 9513, 9514, 9515, 9516, 9517, 9518, 9519, 9520, 9521, 9522, 9523, 9524, 9525, 9526, 9527, 9528, 9529, 9530, 9531, 9532, 9533, 9534, 9535, 9536, 9537, 9538, 9539, 9540, 9541, 9542, 9543, 9544, 9545, 9546, 9547, 9548, 9549, 9550, 9551, 9552, 9553, 9554, 9555, 9556, 9557, 9558, 9559, 9560, 9561, 9562, 9563, 9564, 9565, 9566, 9567, 9568, 9569, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, 9578, 9579, 9580, 9581, 9582, 9583, 9584, 9585, 9586, 9587, 9588, 9589, 9590, 9591, 9592, 9593, 9594, 9595, 9596, 9597, 9598, 9599, 9600, 9601, 9602, 9603, 9604, 9605, 9606, 9607, 9608, 9609, 9610, 9611, 9612, 9613, 9614, 9615, 9616, 9617, 9618, 9619, 9620, 9621, 9622, 9623, 9624, 9625, 9626, 9627, 9628, 9629, 9630, 9631, 9632, 9633, 9634, 9635, 9636, 9637, 9638, 9639, 9640, 9641, 9642, 9643, 9644, 9645, 9646, 9647, 9648, 9649, 9650, 9651, 9652, 9653, 9654, 9655, 9656, 9657, 9658, 9659, 9660, 9661, 9662, 9663, 9664, 9665, 9666, 9667, 9668, 9669, 9670, 9671, 9672, 9673, 9674, 9675, 9676, 9677, 9678, 9679, 9680, 9681, 9682, 9683, 9684, 9685, 9686, 9687, 9688, 9689, 9690, 9691, 9692, 9693, 9694, 9695, 9696, 9697, 9698, 9699, 9700, 9701, 9702, 9703, 9704, 9705, 9706, 9707, 9708, 9709, 9710, 9711, 9712, 9713, 9714, 9715, 9716, 9717, 9718, 9719, 9720, 9721, 9722, 9723, 9724, 9725, 9726, 9727, 9728, 9729, 9730, 9731, 9732, 9733, 9734, 9735, 9736, 9737, 9738, 9739, 9740, 9741, 9742, 9743, 9744, 9745, 9746, 9747, 9748, 9749, 9750, 9751, 9752, 9753, 9754, 9755, 9756, 9757, 9758, 9759, 9760, 9761, 9762, 9763, 9764, 9765, 9766, 9767, 9768, 9769, 9770, 9771, 9772, 9773, 9774, 9775, 9776, 9777, 9778, 9779, 9780, 9781, 9782, 9783, 9784, 9785, 9786, 9787, 9788, 9789, 9790, 9791, 9792, 9793, 9794, 9795, 9796, 9797, 9798, 9799, 9800, 9801, 9802, 9803, 9804, 9805, 9806, 9807, 9808, 9809, 9810, 9811, 9812, 9813, 9814, 9815, 9816, 9817, 9818, 9819, 9820, 9821, 9822, 9823, 9824, 9825, 9826, 9827, 9828, 9829, 9830, 9831, 9832, 9833, 9834, 9835, 9836, 9837, 9838, 9839, 9840, 9841, 9842, 9843, 9844, 9845, 9846, 9847, 9848, 9849, 9850, 9851, 9852, 9853, 9854, 9855, 9856, 9857, 9858, 9859, 9860, 9861, 9862, 9863, 9864, 9865, 9866, 9867, 9868, 9869, 9870, 9871, 9872, 9873, 9874, 9875, 9876, 9877, 9878, 9879, 9880, 9881, 9882, 9883, 9884, 9885, 9886, 9887, 9888, 9889, 9890, 9891, 9892, 9893, 9894, 9895, 9896, 9897, 9898, 9899, 9900, 9901, 9902, 9903, 9904, 9905, 9906, 9907, 9908, 9909, 9910, 9911, 9912, 9913, 9914, 9915, 9916, 9917, 9918, 9919, 9920, 9921, 9922, 9923, 9924, 9925, 9926, 9927, 9928, 9929, 9930, 9931, 9932, 9933, 9934, 9935, 9936, 9937, 9938, 9939, 9940, 9941, 9942, 9943, 9944, 9945, 9946, 9947, 9948, 9949, 9950, 9951, 9952, 9953, 9954, 9955, 9956, 9957, 9958, 9959, 9960, 9961, 9962, 9963, 9964, 9965, 9966, 9967, 9968, 9969, 9970, 9971, 9972, 9973, 9974, 9975, 9976, 9977, 9978, 9979, 9980, 9981, 9982, 9983, 9984, 9985, 9986, 9987, 9988, 9989, 9990, 9991, 9992, 9993, 9994, 9995, 9996, 9997, 9998, 9999]\n"
- ]
- }
- ],
- "source": [
- "# Let us a make a list called big_numbers and append all 4 digit numbers to the list\n",
- "big_numbers = []\n",
- "\n",
- "for i in range(1000,10000):\n",
- " big_numbers.append(i)\n",
- "\n",
- "print(big_numbers)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "9Huo15QgR-z2"
- },
- "source": [
- "Now let's take a scenario, where you made the list b and you've been asked to extract the second till the seventh element. Will you go through typing b[1], b[2], b[3] and so on? What if we take list big_numbers and you were required to extract 500 of those entries? Too much of a pain? Well worry not! Python allows for a simpler way to extract these elements"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "CT9IRxuPR-eg",
- "outputId": "d005a748-89b5-4313-a7bc-38aa9c60f236"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "[1, 2, 3, 4, 5, 6]\n"
- ]
- }
- ],
- "source": [
- "print( b[1:7] ) # Yes that's right, you can slice these elements in this manner. [start_index : end_index + 1]"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "Dakul-ljSRCG"
- },
- "source": [
- "Did you know that python allows you to extract negative indices too? You might be thinking about how that works right? Well whenever we provide python a negative index we essentially ask it to start at the end of the list and go backwards while indexing"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "Dw_WQShg5mn6",
- "outputId": "13433724-56e2-4251-8bcb-8e18b00155cc"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "[4, 5, 6, 7, 8, 9]\n"
- ]
- }
- ],
- "source": [
- "# You can also extract all the elements till the end in the following way\n",
- "print( b[4:] )"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "y1yR_49iSRfD",
- "outputId": "05eb1ea7-b55a-4d16-cf3e-e12cb2d3adb5"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "7\n"
- ]
- }
- ],
- "source": [
- "print( b[-3] ) # SPOILER ALERT: It will print the last element!"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "lV3i9fF16PFT",
- "outputId": "05eda5f8-4b89-4c81-fdbf-29bea876acce"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "[6, 7]\n"
- ]
- }
- ],
- "source": [
- "print( b[-4:-2] )"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "PKtd8bHaSatf"
- },
- "source": [
- "Now what do we do if we want to increment all the elements of b by 2 and store it in a new list c? You'll most probably think of something like this"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "iAKjIG0zSaWD",
- "outputId": "cbee0b77-dcda-440f-b6d0-d8c2ba1c6505"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "[2, 3, 4, 5, 6, 7, 8, 9, 10, 11]\n"
- ]
- }
- ],
- "source": [
- "c = []\n",
- "\n",
- "for i in range(len(b)):\n",
- " c.append(2 + b[i])\n",
- "print(c)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "TFrChrGcSgiC"
- },
- "source": [
- "While in theory this is essentially what is happening, there is another way which is much smaller which python allows for. It's called List Comperehension. Look at the following example"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "8lD4a7xDSg-r",
- "outputId": "7b70cf4d-4a5f-4809-8424-8ebbd2eebfc5"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "[2, 3, 4, 5, 6, 7, 8, 9, 10, 11]\n"
- ]
- }
- ],
- "source": [
- "c = [x+2 for x in b]\n",
- "\n",
- "print(c)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "m9TfOT-pSmnJ"
- },
- "source": [
- "As you can see we've got the same results!!\n",
- "\n",
- "Let's try out an example"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "Jd94V4PVSm_G",
- "outputId": "24e53935-089c-48d3-c63a-31ad5291f0ef"
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "[7, 8, 9, 10, 11]"
- ]
- },
- "execution_count": 22,
- "metadata": {
- "tags": []
- },
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# Let us make a new list d whose entries are those entries in c which are greater than 6\n",
- "d = [x for x in c if x>6]\n",
- "d"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "2c-eDhwRSsZK"
- },
- "source": [
- "Well what do we do if we want to change the 3rd element of the list c to the number 42?"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "Qx6QvwmBSuVL",
- "outputId": "ec11d16f-473e-488e-8846-03e12267395b"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "[2, 3, 42, 5, 6, 7, 8, 9, 10, 11]\n"
- ]
- }
- ],
- "source": [
- "# We simply do\n",
- "c[2] = 42\n",
- "\n",
- "print(c)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "nmTg0SUUSx1B"
- },
- "source": [
- "As you can see the third element of the list has changed\n",
- "\n",
- "Let us try removing one element from somewhere in between. Let's remove 7 from the list c"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "47vaL_GgSyNf",
- "outputId": "171de76d-8158-4aaf-d2e6-183257f3ad31"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "[2, 3, 42, 5, 6, 8, 9, 10, 11]\n"
- ]
- }
- ],
- "source": [
- "c.remove(7)\n",
- "\n",
- "print(c)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "PwfQKc0wS7Su"
- },
- "source": [
- "## Tuples\n",
- "A tuple is a collection of entries which are ordered in the same way as lists but cannot be changed.\n",
- "\n",
- "All the regular list operations apply to tuples except for those which attempt to change it's own value"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "Pq3NlFaeS707",
- "outputId": "fa6c4a5b-2155-4a56-bedb-a1fbd3c11350"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "(1, 2, 3, 4, 5, 6)\n"
- ]
- }
- ],
- "source": [
- "# Let us define a tuple\n",
- "\n",
- "tup_a = (1,2,3,4,5,6)\n",
- "\n",
- "print(tup_a)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "Nr-55sUvS-V9"
- },
- "source": [
- "Let us try changing the entry of a tuple and see what happens"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 164
- },
- "id": "tkBPk7YZTDdX",
- "outputId": "0c07c578-ce14-4a21-c41b-a2c64cfde481"
- },
- "outputs": [
- {
- "ename": "TypeError",
- "evalue": "ignored",
- "output_type": "error",
- "traceback": [
- "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
- "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
- "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mtup_a\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m42\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
- "\u001b[0;31mTypeError\u001b[0m: 'tuple' object does not support item assignment"
- ]
- }
- ],
- "source": [
- "tup_a[2] = 42"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "5XkSzECaTIdh"
- },
- "source": [
- "Oh no, it errored out :(\n",
- " \n",
- "But this was expected right?"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "S2OX8z4yTI2S",
- "outputId": "e886a512-9f08-4522-bbb9-a4b834a11324"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "[6, 8, 10]\n",
- "(3, 4, 5)\n"
- ]
- }
- ],
- "source": [
- "# Make a new list e which has double the values of tuple a and select the 3rd till 5th element (both inclusive) of both list b and tuple tup_a to compare\n",
- "\n",
- "e = [2*x for x in tup_a]\n",
- "\n",
- "print(e[2:5])\n",
- "print(tup_a[2:5])"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "4K_M7yPdrnrL"
- },
- "source": [
- "## Sets\n",
- "A collection of items that is both unordered and unindexed and doesn't allow duplicate values is called a set. Its main usage is to store multiple items in a single variable.\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "xTUCNWINsMWx",
- "outputId": "0a8a6cfa-7c35-4817-efd8-e9536af963a7"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "{'cherry', 'apple', 'banana'}\n",
- "{'cherry', 'apple', 'banana'}\n"
- ]
- }
- ],
- "source": [
- "thisset = {\"apple\", \"banana\", \"cherry\"}\n",
- "print(thisset) \n",
- "\n",
- "#Another way to define it\n",
- "thisset = set([\"apple\", \"banana\", \"cherry\"])\n",
- "print(thisset)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "ifOGk8mVse6x"
- },
- "source": [
- "Well now that we know how to define a set let's go ahead and see some set operations"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "TX9ZyfoKsnvV",
- "outputId": "7309838b-4fad-4289-d287-35424d411dd7"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "The sets: {1, 2, 3, 4, 5, 6, 7} {1, 2, 3, 4, 5}\n",
- "Intersection: {1, 2, 3, 4, 5}\n",
- "Union: {1, 2, 3, 4, 5, 6, 7}\n",
- "Difference: {6, 7}\n"
- ]
- }
- ],
- "source": [
- "one=set([4,5,6,7,1,2,3]) \n",
- "two=set([4,5,3,2,1,2]) \n",
- " \n",
- "print(\"The sets: \", one, two)\n",
- "print (\"Intersection: \",one & two) \n",
- "print (\"Union: \",one | two) \n",
- "print(\"Difference: \",one - two)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "m0UoxWLguXuI"
- },
- "source": [
- "As you can see with set two, the value which was repeated has got deleted while creating the set"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "usMVleHaTXTv"
- },
- "source": [
- "# Dictionaries\n",
- "\n",
- "A dictionary is a collection of key value pairs which is ordered, changable and does not allow duplicate members. \n",
- "\n",
- "Too much terminology which doesn't make sense?\n",
- "\n",
- "Don't worry about it! Let's consider an analogy. \n",
- "\n",
- "What do you do when you save your close friend Manish's phone number on your phone? You type in their name followed by their phone number so that when they call you, you don't just see 10 digits staring at your face but instead see your friend's name. Well while saving that friend's number you have essentially created a dictionary!!!!\n",
- "\n",
- "You have used the friend's name as the key and his/her phone number as the value in the key value pair of the dictionary"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "E8eqQEHtTWnO",
- "outputId": "9aa39607-e7c7-4e04-a59b-03cfe20be83f"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "{'Manish': 9937593721}\n"
- ]
- }
- ],
- "source": [
- "phone_num = {'Manish': 9937593721} # This is just a random number I typed which starts with 9 please don't call this number, I don't even know if it's valid.\n",
- "\n",
- "print(phone_num)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "X7ORBE0BTevt"
- },
- "source": [
- "You go on and meet another friend of yours whose name is Harish. He gives you his number so once again you save this number"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "esUUobJ6TeV_",
- "outputId": "b611f7c6-962d-43ea-ec34-e7a7cafac06c"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "{'Manish': 9937593721, 'Harish': 9203848363}\n"
- ]
- }
- ],
- "source": [
- "phone_num['Harish'] = 9203848363 # You can make a new entry by mentioning the key and the value as shown\n",
- "\n",
- "print(phone_num)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "mXydVwQ-T08F"
- },
- "source": [
- "While you were talking to Harish, somewhere in the conversation Harish tells you that very recently he had switched his phone and he lost all his contacts. He asks you to give him Manish's number as they too are good friends. But wait none of us actually remember all our friends numbers do we? :P\n",
- "\n",
- "Well the dictionary you created can be used for this purpose!"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "rdWDuXngT1OG",
- "outputId": "77c79f81-8709-4918-b761-7f0856c53db7"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "9937593721\n"
- ]
- }
- ],
- "source": [
- "print( phone_num['Manish'] )"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "2vD73bfBT5jA"
- },
- "source": [
- "While you're talking Harish who is a little absent minded suddenly remembers that he gave you his old phone number by mistake and now wants you to save his new number. Well how do we do that with dictionaries?"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "6ttetOZsT506",
- "outputId": "e2216c87-6ecf-47b9-b572-90c0326274bc"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "{'Manish': 9937593721, 'Harish': 9694038272}\n"
- ]
- }
- ],
- "source": [
- "phone_num['Harish'] = 9694038272 # It's that simple!\n",
- "\n",
- "print(phone_num)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "GeQnecUfT74O"
- },
- "source": [
- "And while he's at it, he asks you to also save his email ID just in case something goes wrong. Well you might be thinking how do we do that? \n",
- "\n",
- "Did you know that python also allows us to make a dictionary inside a dictionary?"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "VGpAlqkRT-km",
- "outputId": "ebfeb4ba-16d8-401f-bbe2-c22a66c060c3"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "{'Manish': 9937593721, 'Harish': {'number': 9694038272, 'email': 'harishsinha2002@abc.com'}}\n"
- ]
- }
- ],
- "source": [
- "phone_num['Harish'] = {'number': 9694038272, 'email': 'harishsinha2002@abc.com'}\n",
- "\n",
- "print(phone_num)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "sxW4CJnqUAvb"
- },
- "source": [
- "Well how convenient is that?"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "ACszkje_V95i"
- },
- "source": [
- "# **Python Libraries**\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "AEz0gZBXWAT3"
- },
- "source": [
- "What is a Library?
A collection of modules used for specific applications.
\n",
- "Popular Libraries in Python\n",
- "\n",
- "* NumPy\n",
- "* Pandas\n",
- "* OpenCV\n",
- "* Matplotlib\n",
- "* Scipy\n",
- "* Tensorflow\n",
- "* PyTorch \n",
- "
and many more...\n",
- "\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "bjTO_7tSWBot"
- },
- "source": [
- "##Importing a Library\n",
- "We use 'import' to get access to the functions of the library"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "id": "6V8X-PQEWBEH"
- },
- "outputs": [],
- "source": [
- "# importing numpy library with the keyword as np\n",
- "# Syntax: import as \n",
- "# Note: as part is optional, but recommended\n",
- "import numpy as np"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "m6rJ1tqEWI0B"
- },
- "source": [
- "Here, we use a short hand notation for NumPy as 'np' while importing. Trust me, it saves time :)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "S9LxCd_Ciram"
- },
- "source": [
- "# Introduction to NumPy\n",
- "What is NumPy?
\n",
- "A python library used to deal with large multidimensional arrays.
\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "z1cVCp6Om8ms",
- "outputId": "61d21900-2cc9-460a-dc24-bb90bf01d8a6"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "[ 9 23 32 47 53] \n"
- ]
- }
- ],
- "source": [
- "#Code along with us\n",
- "x=np.array([9,23,32,47,53])\n",
- "print(x, type(x))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "PRrqtg4fkpRo"
- },
- "source": [
- "Bro, we already have Lists and Tuples right? Why NumPy?
\n",
- "Let's compare"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "id": "1nYkT8ADd4pa"
- },
- "outputs": [],
- "source": [
- "N = 100000"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "wTamN8S5lSBk"
- },
- "source": [
- "Let's create a list with N entries containing integers from 0 to N-1 and multiply it element-wise with itself.
%%time will time the operation."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "LNLzAdSrk0am",
- "outputId": "321d6458-8585-47f2-edba-f467ea4a4e1f"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "CPU times: user 28.1 ms, sys: 3.62 ms, total: 31.8 ms\n",
- "Wall time: 34.6 ms\n"
- ]
- }
- ],
- "source": [
- "%%time\n",
- "list_ = list(range(N))\n",
- "for i in range(N):\n",
- " list_[i] = list_[i] * list_[i]"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "6AHFz9l7mKr7"
- },
- "source": [
- "Now, let's replicate this process using NumPy. Observe the simplicity in syntax and the latency"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "_3jeUsRtmX_L",
- "outputId": "f78934df-2a82-495d-acbf-c04ad6ef32b5"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "CPU times: user 960 Β΅s, sys: 2.06 ms, total: 3.03 ms\n",
- "Wall time: 5.78 ms\n"
- ]
- }
- ],
- "source": [
- "%%time\n",
- "arr = np.arange(N)\n",
- "arr = arr * arr"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "1t2xPoV9Nj9x"
- },
- "source": [
- "## Creating NumPy arrays"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "O1PvcfTJN1qi",
- "outputId": "7ee61796-6fd4-42de-9f6a-b638888b2919"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "int64\n",
- "1\n",
- "(12,)\n",
- "12\n"
- ]
- }
- ],
- "source": [
- "# Creating an array\n",
- "arr = np.arange(12)\n",
- "# Datatype of entries in np array\n",
- "print(arr.dtype)\n",
- "# Dimension of np array\n",
- "print(arr.ndim)\n",
- "# Shape of array\n",
- "print(arr.shape)\n",
- "# Size of array\n",
- "print(arr.size)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "a9wtsEgEPQtA"
- },
- "source": [
- "Let's create a 2 Dimensional array"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "ExecuteTime": {
- "end_time": "2021-02-11T16:36:56.997797Z",
- "start_time": "2021-02-11T16:36:56.987202Z"
+ "nbformat": 4,
+ "nbformat_minor": 0,
+ "metadata": {
+ "colab": {
+ "name": "Python and GIT Basics-Summer School",
+ "provenance": [],
+ "collapsed_sections": [
+ "mAhhefzL2kCv",
+ "5uYr3wCTc8po",
+ "xaM0XSnZregM",
+ "k7W-ZEdiookv"
+ ]
+ },
+ "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.7.6"
+ }
+ },
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "ocxMXW4wcLuM"
+ },
+ "source": [
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "JGXgeI7DpmWx"
+ },
+ "source": [
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "Jw-ybw_DqGGJ"
+ },
+ "source": [
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "M-wcrzB1qI11"
+ },
+ "source": [
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "MP-rRuuoqM7P"
+ },
+ "source": [
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "4CSgt9bqD8Ia"
+ },
+ "source": [
+ "## Why Python?\n",
+ "\n",
+ "\n",
+ "* It's easier to learn and use in comparison to other languages like C++ or Java, due to its simpler syntax.\n",
+ "\n",
+ "* It has a huge, rapidly growing supportive community\n",
+ "\n",
+ "* It has a large number of libraries and frameworks made by third parties. This makes it even easier to use python\n",
+ "\n",
+ "These reasons make Python extremely popular in the AI community.\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "hpmHarMoKRqy",
+ "outputId": "f980cc2a-c6d4-4abb-8afd-d3d73b2f3b71"
+ },
+ "source": [
+ "print(\"hello world!\")\n",
+ "# This statement is all it takes to print \"hello\"\n",
+ "# These lines are called comments\n",
+ "# adding a '#' before a line makes it a comment\n",
+ "# The compiler ignores comments\n",
+ "# They can be used to explain code or comment out some lines of code to prevent their execution "
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "hello world!\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "P9d9lPfUTipz"
+ },
+ "source": [
+ "## Contents\n",
+ "\n",
+ "\n",
+ "* Data types\n",
+ "* Operators\n",
+ "* Conditional Statements\n",
+ "* Loops \n",
+ "* Functions\n",
+ "* Classes\n",
+ "* Lists\n",
+ "* Tuples \n",
+ "* Dictionary\n",
+ "* Python Library\n",
+ "* Numpy\n",
+ "* Matplotlib\n",
+ "* Git & GitHub\n",
+ "\n",
+ "\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "R5Tdviy-VwjX"
+ },
+ "source": [
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "aH-Vh_TRVwr7"
+ },
+ "source": [
+ "## Data types\n",
+ "\n",
+ "* Variables are classified using data types\n",
+ "\n",
+ "* Each data type gives a variable different properties\n",
+ "\n",
+ "* Using data types lets us know what is expected from each variable; \n",
+ "\n",
+ "* Furthermore, functions react differently to variables based on their data type\n",
+ "\n",
+ "The most commonly used data types are :\n",
+ "\n",
+ "\n",
+ "* Numeric: \n",
+ " * int (integers)\n",
+ " * float (decimal values)\n",
+ "\n",
+ "* strings (characters, words and sentences)\n",
+ "\n",
+ "* bool (boolean values, i.e. True or False)\n",
+ "\n",
+ "* Sequential Data Types:\n",
+ " * list\n",
+ " * tuple\n",
+ " * range \n",
+ "\n",
+ "* set (Sets)\n",
+ "* dict (Dictionaries)\n",
+ "\n",
+ "\n",
+ "There are several other data types but we'll be focusing on these in this session.\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "N0_Qh7uHXbIx"
+ },
+ "source": [
+ "x = 10 \n",
+ "name = \"Student\"\n",
+ "\n",
+ "print(x)\n",
+ "print(name)\n",
+ "\n",
+ "print(type(x))\n",
+ "print(type(name))"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "94ajOCm5XpsA"
+ },
+ "source": [
+ "This example shows that Python doesn't require us to declare the data type for a variable. \n",
+ "\n",
+ "This is unlike many other popular programming languages.\n",
+ "\n",
+ "It is capable of infering the data type from the value assigned to the variable."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "2NcjikVaBuvZ"
+ },
+ "source": [
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "4AjgJNPhCwFA"
+ },
+ "source": [
+ "##Operators\n",
+ "Operators perfom processes on variables and constants. The different kinds of operators can be understood through examples.\n",
+ "\n",
+ "###Arithmetic Operators\n",
+ "\n",
+ "\n",
+ "1. Addition (+)\n",
+ "2. Subtraction (-)\n",
+ "3. Multiplication (*)\n",
+ "4. Division (/)\n",
+ "5. Modulus(%)\n",
+ "6. Exponent(**)\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "tSkILN2FDhrC",
+ "outputId": "cc481202-5711-442c-a459-d86356399bdc"
+ },
+ "source": [
+ "a = 5\n",
+ "b = 6\n",
+ "\n",
+ "# operations in order\n",
+ "\n",
+ "print('a + b = ', a + b)\n",
+ "print('b - 2 = ', b - 2)\n",
+ "print('a*4 =', a * 4)\n",
+ "print('b/3 = ', b/3)\n",
+ "print('a % b = ', a%b)\n",
+ "print('a^2 = ', a**2 )\n"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "a + b = 11\n",
+ "b - 2 = 4\n",
+ "a*4 = 20\n",
+ "b/3 = 2.0\n",
+ "a % b = 5\n",
+ "a^2 = 25\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "qOn_PEWPDqgB"
+ },
+ "source": [
+ "###Comparison Operators\n",
+ "\n",
+ "\n",
+ "1. Check equality (== )\n",
+ "2. Check inequality(!= or <>)\n",
+ "3. Greater than (>)\n",
+ "4. Less than(<)\n",
+ "5. Greater than or equal to (>=)\n",
+ "6. Less than or equal to (<=)\n",
+ "\n",
+ "When used in expressions, the truth value of the expression returned. \n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "mhRC0bPOEYno"
+ },
+ "source": [
+ "a = 5\n",
+ "b = 6\n",
+ "\n",
+ "#operations in order\n",
+ "\n",
+ "print(a==b)\n",
+ "print(b!=2)\n",
+ "print(a>4)\n",
+ "print(b<3)\n",
+ "print(a>=b)\n",
+ "print(a<=2)"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "KSeM7cmOEfFq"
+ },
+ "source": [
+ "###Logical Operators\n",
+ "\n",
+ "\n",
+ "\n",
+ "1. and\n",
+ "2. or\n",
+ "3. not\n",
+ "\n",
+ "When used in expressions, the truth value of the expression returned.\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "cfbb9e-CEo00"
+ },
+ "source": [
+ "a = 5\n",
+ "b = 6\n",
+ "if(a==b and b>5):\n",
+ " print(\"something\")\n",
+ "\n",
+ "if(a==5 or b==2):\n",
+ " print(\"some other thing\")\n",
+ "\n",
+ "if(not b==9):\n",
+ " print(\"b is not equal to 9\") "
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "wRCvlO4Cpdzm"
+ },
+ "source": [
+ "##Conditional Statements\n",
+ "\n",
+ "Conditional Statements are used in decision making."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "YDjv_d1SbiU5"
+ },
+ "source": [
+ "a = 100 #assignment\n",
+ "\n",
+ "if a == 100: #comparison\n",
+ " print(\"ok\") #indentation\n",
+ "else:\n",
+ " print(\"not ok\")"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "fR1NevmkrpYC"
+ },
+ "source": [
+ "Here we had to make a decision based on the value of a - whether to print 'nice' or not. That is what we use the following *keywords* for:\n",
+ "\n",
+ "\n",
+ "* if\n",
+ "* else\n",
+ "* elif\n",
+ "\n",
+ "These make use of test expressions, logical operations that evaluate to TRUE or FALSE - *if* the expression is true, the part indented below the 'if' expression is executed. Otherwise, it is ignored.\n",
+ "\n",
+ "The use of 'else' and 'elif' can be somewhat intuitively understood by the following code.\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "rYFcNu_7skg3"
+ },
+ "source": [
+ "b = 70\n",
+ "if b == 100:\n",
+ " print('alright')\n",
+ "elif b == 70: # if multiple 'elif's evaluate to true, only the first one is executed\n",
+ " print('ok')\n",
+ "else:\n",
+ " print('not ok')"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "yxmh6_DKs_0y"
+ },
+ "source": [
+ "##Loops\n",
+ "Let's look at two programs with the same output:\n",
+ "\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "r4vqxmA4wv1J"
+ },
+ "source": [
+ "print('welcome to summer school')\n",
+ "print('welcome to summer school')\n",
+ "print('welcome to summer school')\n",
+ "print('welcome to summer school')\n",
+ "print('welcome to summer school')\n",
+ "print('welcome to summer school')\n",
+ "print('welcome to summer school')"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "c11KUDuMxN9q"
+ },
+ "source": [
+ "t = 0 \n",
+ "while( t < 7):\n",
+ " print(\"welcome to summer school\")\n",
+ " t = t + 1 #incrementing t"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "NgLRIhSUxaRZ"
+ },
+ "source": [
+ "Which of those two programs seemed more efficient? Furthermore, the first method would be impractical for tasks that need to be repeated thousands of times, as is the case in modern times. \n",
+ "\n",
+ "There are two kinds of loops in Python\n",
+ "\n",
+ "* ones in which the no. of iterations don't have to be specified, in other words, a terminating condition will do (while loops)\n",
+ "\n",
+ "* ones in which the no. of iterations have to be specified (for loops)\n",
+ "\n",
+ "Each repeating step in a loop is called an *iteration*\n",
+ "\n",
+ "###While loop\n",
+ "\n",
+ "The while loop has the following form:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "QUVvvaq8yOzt"
+ },
+ "source": [
+ "i = 0\n",
+ "while(i < 10):\n",
+ " print(i)\n",
+ " i = i + 1"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "VLeQ-XeAyVUG"
+ },
+ "source": [
+ "As you can see, we did not specify the number of iterations.\n",
+ "\n",
+ "Loops make use of a test expression as well - they check the expression before each iteration, and execute said iteration only if the test expression evaluates to \"TRUE\"\n",
+ "\n",
+ "##For Loop\n",
+ "\n",
+ "We also have the *for* loop, where we do have to specify the number of iterations. Let's look at some example code:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "s2iJWRJk69J5",
+ "outputId": "17c130d7-c1c0-4d05-dc2c-f5bb9012f92e"
+ },
+ "source": [
+ "for i in range(0,5,1):\n",
+ "\tprint(i)\n"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "0\n",
+ "1\n",
+ "2\n",
+ "3\n",
+ "4\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "en1WEIPWd1lH"
+ },
+ "source": [
+ "## Nested Loops\n",
+ "\n",
+ "Loops within loops"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "T3WpF5taQDDU",
+ "outputId": "5c8760f6-bac4-4867-95a0-1c3d6c3f71c4"
+ },
+ "source": [
+ "x = 4\n",
+ "for i in range(1, x + 1):\n",
+ " for j in range(1, i + 1):\n",
+ " print(j, end = '')\n",
+ " print('')"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "1\n",
+ "12\n",
+ "123\n",
+ "1234\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "ojNbEV08gXNn"
+ },
+ "source": [
+ "### Example: Fibonacci Sequence \n",
+ "\n",
+ "The fibonacci sequence is a sequence in which:\n",
+ "\n",
+ "(an denotes the nth element)\n",
+ "\n",
+ "* a1 = 0 \n",
+ "\n",
+ "* a2 = 1\n",
+ "\n",
+ "* for n > 2, the an = an - 1 + an - 2 \n",
+ "\n",
+ "0, 1, 1, 2, 3, 5, 8 ... ,an - 2, an - 1, an - 1 + an - 2"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "yWjO9U-0SzXj"
+ },
+ "source": [
+ "x = int(input()) #to accept input from the user, and then convert it to an integer\n",
+ "if x<=0:\n",
+ " print(\"Invalid input. Enter a positive integer.\")\n",
+ "else:\n",
+ " if x == 1:\n",
+ " print('0')\n",
+ " else:\n",
+ " print('0, 1', end = '')\n",
+ " \n",
+ " if x > 2:\n",
+ " a = 0\n",
+ " b = 1\n",
+ " for i in range(3, x+1):\n",
+ " c = a + b\n",
+ " print(', ', c, end = '')\n",
+ " a = b\n",
+ " b = c\n"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "CcPb8jUeN2hs"
+ },
+ "source": [
+ "##Example Problem: Adding Reversed Numbers\n",
+ "\n",
+ "Based on the SPOJ.com problem: https://www.spoj.com/problems/ADDREV/\n",
+ "\n",
+ "Given two integers, reverse their digits and add them."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "GXQTBfaLk4DV"
+ },
+ "source": [
+ "# enter your code here"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "-Y3VxgxiACFx"
+ },
+ "source": [
+ "## Functions\n",
+ "\n",
+ "* Functions are modules of code that accomplish a specific task. \n",
+ "* A function executes only when it is called.\n",
+ "* Functions usually take inputs (data), process it, and output (or return) result. Once a function is written, it can be used over and over again."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "eWsZApVTAGrl"
+ },
+ "source": [
+ "# example function\n",
+ "def add_nums(a, b):\n",
+ " return a+b\n",
+ "\n",
+ "print(add_nums(2,3)) #function call inside the print statement and even print is a function call"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "UB8Dmu16jGHe"
+ },
+ "source": [
+ "Well at this point you might think, why do we even need functions? it would be easier to type a+b than add_nums(a,b)\n",
+ "\n",
+ "But what happens when you have bigger pieces of code that you want to run?\n",
+ "\n",
+ "Let's say you want to check if a number is even or odd"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "nBGuqI1Gi7OL"
+ },
+ "source": [
+ "def odd_even(num):\n",
+ " if num % 2 == 0:\n",
+ " return 'Even'\n",
+ " else:\n",
+ " return 'Odd'"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "v4azWl0PjkXp"
+ },
+ "source": [
+ "print(odd_even(4), odd_even(6), odd_even(5))"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "3jBci86hjxiF"
+ },
+ "source": [
+ "Clearly, that saved us a lot of time and unnecesary typing of code."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "iH9I-9ljAL85"
+ },
+ "source": [
+ "## Classes\n",
+ "\n",
+ "A class is a blueprint for an object.\n",
+ "\n",
+ "It is a way to bundle data (even of different data types) together. \n",
+ "Each variable or piece of data is known as an attribute of the class.\n",
+ "\n",
+ "In addition, a class can have functions associated with it called methods.\n",
+ "\n",
+ "An object is an instance of a class. This is similar to how the variable \"num\" was an integer in the previous example.\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "kIIciT0ZAPkg",
+ "outputId": "677ea205-2a91-43f9-ba0c-cf3bae941e21"
+ },
+ "source": [
+ "# example class\n",
+ "\n",
+ "class MyClass:\n",
+ " language = \"python\"\n",
+ " x = 3.14\n",
+ " isTrue = True\n",
+ "\n",
+ " # member function/ method\n",
+ " def show(self):\n",
+ " print('My favorite programming language is', self.language)\n",
+ " print(self.x) \n",
+ "\n",
+ "c1 = MyClass() # creating an instance of a MyClass\n",
+ "c1.show()"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "My favorite programming language is python\n",
+ "3.14\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "MPS3xntdR60s"
+ },
+ "source": [
+ "### self\n",
+ "* class methods must include an extra first parameter in the method definition \n",
+ "\n",
+ "* we don't give assign values for this parameter when we call the method, intstead Python provides it\n",
+ "\n",
+ "* if we have a method that takes no arguments, then we still have to have one argument.\n",
+ "\n",
+ "* self is similar to this pointer in C++ and this reference in Java"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "StEaVKmGQWJz"
+ },
+ "source": [
+ "### \\_init_()\n",
+ "\n",
+ "* The \\__init__ method is similar to constructors in C++ and Java\n",
+ "\n",
+ "* constructors are used to initialize the objectβs state\n",
+ "\n",
+ "* like other methods, a constructor also contains a collection of statements that are executed at the time of object creation\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "mg69KjuaQEn4",
+ "outputId": "24c7734c-0dd8-4692-cbdb-f5064f0d9c4a"
+ },
+ "source": [
+ "class Vehicle:\n",
+ " \n",
+ " # class Variable\n",
+ " vehicle_type = 'car' \n",
+ "\n",
+ " # init method or constructor\n",
+ " def __init__(self, company, color):\n",
+ " \n",
+ " # instance variables \n",
+ "\n",
+ " self.company = company\n",
+ " self.color = color \n",
+ " \n",
+ " # method to display details\n",
+ " def show(self): \n",
+ " print('Vehicle type: ', self.vehicle_type)\n",
+ " print('company: ', self.company)\n",
+ " print('color: ', self.color)\n",
+ " \n",
+ "\n",
+ "# Objects of Dog class\n",
+ "C1 = Vehicle(\"Ferrari\", \"red\")\n",
+ "C2 = Vehicle(\"Mercedes\", \"gold\")\n",
+ " \n",
+ "# displays details of C1 \n",
+ "print('C1 details: ', end = '') \n",
+ "C1.show()\n",
+ " \n",
+ "# accessing using class names\n",
+ "print(\"\\naccessing class variable using class name\")\n",
+ "print(C1.color)\n",
+ "print(C2.company)"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "C1 details: Vehicle type: car\n",
+ "company: Ferrari\n",
+ "color: red\n",
+ "\n",
+ "accessing class variable using class name\n",
+ "red\n",
+ "Mercedes\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "QllyOobJPgfM"
+ },
+ "source": [
+ "## Lists\n",
+ "\n",
+ "A list is a collections of entries that is ordered and can be changed. They also allow duplicate entries. Entries of a list don't need to be of the same datatype. Look at some of the examples given below"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "b2E3u0hA42AO"
+ },
+ "source": [
+ ""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "may4Qsi6PjL3",
+ "outputId": "0a0e25e3-f77d-426f-ecd5-0926f69f3a9e"
+ },
+ "source": [
+ "a = ['Hello', 2, True, 'The End']\n",
+ "print(a)"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "['Hello', 2, True, 'The End']\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "QToWvYjaRueq"
+ },
+ "source": [
+ "You can access individual members of the list too!!\n",
+ "\n",
+ "Remember that the indexing starts from 0\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "kmCx-11oRxAT",
+ "outputId": "6e77035f-d1bf-4ab3-a0c7-7e24fb874e20"
+ },
+ "source": [
+ "print(a[0], a[2])"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "Hello True\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "dSfPPJALR1HB"
+ },
+ "source": [
+ "You can find out about the length of a list using the len function"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "WEDaQXaJR1ok",
+ "outputId": "1ab97250-ee42-4b8b-978a-9385b95cd057"
+ },
+ "source": [
+ "print(len(a))"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "4\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "sIi7ReCNR4GD"
+ },
+ "source": [
+ "You learnt about for loops earlier right? Let's use that to make a slightly bigger list using the append function"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "6OFDFyBpR4ac",
+ "outputId": "3a20cf87-c3bd-4d3e-b111-41fb85b73b5e"
+ },
+ "source": [
+ "b = [] #Declare an empty list to which we will add elements\n",
+ "print(b)\n",
+ "for num in range(10):\n",
+ " b.append(num) # It's that simple!!!!\n",
+ " print(b)"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "[]\n",
+ "[0]\n",
+ "[0, 1]\n",
+ "[0, 1, 2]\n",
+ "[0, 1, 2, 3]\n",
+ "[0, 1, 2, 3, 4]\n",
+ "[0, 1, 2, 3, 4, 5]\n",
+ "[0, 1, 2, 3, 4, 5, 6]\n",
+ "[0, 1, 2, 3, 4, 5, 6, 7]\n",
+ "[0, 1, 2, 3, 4, 5, 6, 7, 8]\n",
+ "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "LMJF3eq4SCEq",
+ "outputId": "6af6b2c8-4101-4178-bb7e-ef5ab502e219"
+ },
+ "source": [
+ "# Let us a make a list called big_numbers and append all 4 digit numbers to the list\n",
+ "big_numbers = []\n",
+ "\n",
+ "for i in range(1000,10000):\n",
+ " big_numbers.append(i)\n",
+ "\n",
+ "print(big_numbers)"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "[1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1164, 1165, 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, 1263, 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1272, 1273, 1274, 1275, 1276, 1277, 1278, 1279, 1280, 1281, 1282, 1283, 1284, 1285, 1286, 1287, 1288, 1289, 1290, 1291, 1292, 1293, 1294, 1295, 1296, 1297, 1298, 1299, 1300, 1301, 1302, 1303, 1304, 1305, 1306, 1307, 1308, 1309, 1310, 1311, 1312, 1313, 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1321, 1322, 1323, 1324, 1325, 1326, 1327, 1328, 1329, 1330, 1331, 1332, 1333, 1334, 1335, 1336, 1337, 1338, 1339, 1340, 1341, 1342, 1343, 1344, 1345, 1346, 1347, 1348, 1349, 1350, 1351, 1352, 1353, 1354, 1355, 1356, 1357, 1358, 1359, 1360, 1361, 1362, 1363, 1364, 1365, 1366, 1367, 1368, 1369, 1370, 1371, 1372, 1373, 1374, 1375, 1376, 1377, 1378, 1379, 1380, 1381, 1382, 1383, 1384, 1385, 1386, 1387, 1388, 1389, 1390, 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399, 1400, 1401, 1402, 1403, 1404, 1405, 1406, 1407, 1408, 1409, 1410, 1411, 1412, 1413, 1414, 1415, 1416, 1417, 1418, 1419, 1420, 1421, 1422, 1423, 1424, 1425, 1426, 1427, 1428, 1429, 1430, 1431, 1432, 1433, 1434, 1435, 1436, 1437, 1438, 1439, 1440, 1441, 1442, 1443, 1444, 1445, 1446, 1447, 1448, 1449, 1450, 1451, 1452, 1453, 1454, 1455, 1456, 1457, 1458, 1459, 1460, 1461, 1462, 1463, 1464, 1465, 1466, 1467, 1468, 1469, 1470, 1471, 1472, 1473, 1474, 1475, 1476, 1477, 1478, 1479, 1480, 1481, 1482, 1483, 1484, 1485, 1486, 1487, 1488, 1489, 1490, 1491, 1492, 1493, 1494, 1495, 1496, 1497, 1498, 1499, 1500, 1501, 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1511, 1512, 1513, 1514, 1515, 1516, 1517, 1518, 1519, 1520, 1521, 1522, 1523, 1524, 1525, 1526, 1527, 1528, 1529, 1530, 1531, 1532, 1533, 1534, 1535, 1536, 1537, 1538, 1539, 1540, 1541, 1542, 1543, 1544, 1545, 1546, 1547, 1548, 1549, 1550, 1551, 1552, 1553, 1554, 1555, 1556, 1557, 1558, 1559, 1560, 1561, 1562, 1563, 1564, 1565, 1566, 1567, 1568, 1569, 1570, 1571, 1572, 1573, 1574, 1575, 1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, 1584, 1585, 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593, 1594, 1595, 1596, 1597, 1598, 1599, 1600, 1601, 1602, 1603, 1604, 1605, 1606, 1607, 1608, 1609, 1610, 1611, 1612, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 1620, 1621, 1622, 1623, 1624, 1625, 1626, 1627, 1628, 1629, 1630, 1631, 1632, 1633, 1634, 1635, 1636, 1637, 1638, 1639, 1640, 1641, 1642, 1643, 1644, 1645, 1646, 1647, 1648, 1649, 1650, 1651, 1652, 1653, 1654, 1655, 1656, 1657, 1658, 1659, 1660, 1661, 1662, 1663, 1664, 1665, 1666, 1667, 1668, 1669, 1670, 1671, 1672, 1673, 1674, 1675, 1676, 1677, 1678, 1679, 1680, 1681, 1682, 1683, 1684, 1685, 1686, 1687, 1688, 1689, 1690, 1691, 1692, 1693, 1694, 1695, 1696, 1697, 1698, 1699, 1700, 1701, 1702, 1703, 1704, 1705, 1706, 1707, 1708, 1709, 1710, 1711, 1712, 1713, 1714, 1715, 1716, 1717, 1718, 1719, 1720, 1721, 1722, 1723, 1724, 1725, 1726, 1727, 1728, 1729, 1730, 1731, 1732, 1733, 1734, 1735, 1736, 1737, 1738, 1739, 1740, 1741, 1742, 1743, 1744, 1745, 1746, 1747, 1748, 1749, 1750, 1751, 1752, 1753, 1754, 1755, 1756, 1757, 1758, 1759, 1760, 1761, 1762, 1763, 1764, 1765, 1766, 1767, 1768, 1769, 1770, 1771, 1772, 1773, 1774, 1775, 1776, 1777, 1778, 1779, 1780, 1781, 1782, 1783, 1784, 1785, 1786, 1787, 1788, 1789, 1790, 1791, 1792, 1793, 1794, 1795, 1796, 1797, 1798, 1799, 1800, 1801, 1802, 1803, 1804, 1805, 1806, 1807, 1808, 1809, 1810, 1811, 1812, 1813, 1814, 1815, 1816, 1817, 1818, 1819, 1820, 1821, 1822, 1823, 1824, 1825, 1826, 1827, 1828, 1829, 1830, 1831, 1832, 1833, 1834, 1835, 1836, 1837, 1838, 1839, 1840, 1841, 1842, 1843, 1844, 1845, 1846, 1847, 1848, 1849, 1850, 1851, 1852, 1853, 1854, 1855, 1856, 1857, 1858, 1859, 1860, 1861, 1862, 1863, 1864, 1865, 1866, 1867, 1868, 1869, 1870, 1871, 1872, 1873, 1874, 1875, 1876, 1877, 1878, 1879, 1880, 1881, 1882, 1883, 1884, 1885, 1886, 1887, 1888, 1889, 1890, 1891, 1892, 1893, 1894, 1895, 1896, 1897, 1898, 1899, 1900, 1901, 1902, 1903, 1904, 1905, 1906, 1907, 1908, 1909, 1910, 1911, 1912, 1913, 1914, 1915, 1916, 1917, 1918, 1919, 1920, 1921, 1922, 1923, 1924, 1925, 1926, 1927, 1928, 1929, 1930, 1931, 1932, 1933, 1934, 1935, 1936, 1937, 1938, 1939, 1940, 1941, 1942, 1943, 1944, 1945, 1946, 1947, 1948, 1949, 1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, 1958, 1959, 1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026, 2027, 2028, 2029, 2030, 2031, 2032, 2033, 2034, 2035, 2036, 2037, 2038, 2039, 2040, 2041, 2042, 2043, 2044, 2045, 2046, 2047, 2048, 2049, 2050, 2051, 2052, 2053, 2054, 2055, 2056, 2057, 2058, 2059, 2060, 2061, 2062, 2063, 2064, 2065, 2066, 2067, 2068, 2069, 2070, 2071, 2072, 2073, 2074, 2075, 2076, 2077, 2078, 2079, 2080, 2081, 2082, 2083, 2084, 2085, 2086, 2087, 2088, 2089, 2090, 2091, 2092, 2093, 2094, 2095, 2096, 2097, 2098, 2099, 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107, 2108, 2109, 2110, 2111, 2112, 2113, 2114, 2115, 2116, 2117, 2118, 2119, 2120, 2121, 2122, 2123, 2124, 2125, 2126, 2127, 2128, 2129, 2130, 2131, 2132, 2133, 2134, 2135, 2136, 2137, 2138, 2139, 2140, 2141, 2142, 2143, 2144, 2145, 2146, 2147, 2148, 2149, 2150, 2151, 2152, 2153, 2154, 2155, 2156, 2157, 2158, 2159, 2160, 2161, 2162, 2163, 2164, 2165, 2166, 2167, 2168, 2169, 2170, 2171, 2172, 2173, 2174, 2175, 2176, 2177, 2178, 2179, 2180, 2181, 2182, 2183, 2184, 2185, 2186, 2187, 2188, 2189, 2190, 2191, 2192, 2193, 2194, 2195, 2196, 2197, 2198, 2199, 2200, 2201, 2202, 2203, 2204, 2205, 2206, 2207, 2208, 2209, 2210, 2211, 2212, 2213, 2214, 2215, 2216, 2217, 2218, 2219, 2220, 2221, 2222, 2223, 2224, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2233, 2234, 2235, 2236, 2237, 2238, 2239, 2240, 2241, 2242, 2243, 2244, 2245, 2246, 2247, 2248, 2249, 2250, 2251, 2252, 2253, 2254, 2255, 2256, 2257, 2258, 2259, 2260, 2261, 2262, 2263, 2264, 2265, 2266, 2267, 2268, 2269, 2270, 2271, 2272, 2273, 2274, 2275, 2276, 2277, 2278, 2279, 2280, 2281, 2282, 2283, 2284, 2285, 2286, 2287, 2288, 2289, 2290, 2291, 2292, 2293, 2294, 2295, 2296, 2297, 2298, 2299, 2300, 2301, 2302, 2303, 2304, 2305, 2306, 2307, 2308, 2309, 2310, 2311, 2312, 2313, 2314, 2315, 2316, 2317, 2318, 2319, 2320, 2321, 2322, 2323, 2324, 2325, 2326, 2327, 2328, 2329, 2330, 2331, 2332, 2333, 2334, 2335, 2336, 2337, 2338, 2339, 2340, 2341, 2342, 2343, 2344, 2345, 2346, 2347, 2348, 2349, 2350, 2351, 2352, 2353, 2354, 2355, 2356, 2357, 2358, 2359, 2360, 2361, 2362, 2363, 2364, 2365, 2366, 2367, 2368, 2369, 2370, 2371, 2372, 2373, 2374, 2375, 2376, 2377, 2378, 2379, 2380, 2381, 2382, 2383, 2384, 2385, 2386, 2387, 2388, 2389, 2390, 2391, 2392, 2393, 2394, 2395, 2396, 2397, 2398, 2399, 2400, 2401, 2402, 2403, 2404, 2405, 2406, 2407, 2408, 2409, 2410, 2411, 2412, 2413, 2414, 2415, 2416, 2417, 2418, 2419, 2420, 2421, 2422, 2423, 2424, 2425, 2426, 2427, 2428, 2429, 2430, 2431, 2432, 2433, 2434, 2435, 2436, 2437, 2438, 2439, 2440, 2441, 2442, 2443, 2444, 2445, 2446, 2447, 2448, 2449, 2450, 2451, 2452, 2453, 2454, 2455, 2456, 2457, 2458, 2459, 2460, 2461, 2462, 2463, 2464, 2465, 2466, 2467, 2468, 2469, 2470, 2471, 2472, 2473, 2474, 2475, 2476, 2477, 2478, 2479, 2480, 2481, 2482, 2483, 2484, 2485, 2486, 2487, 2488, 2489, 2490, 2491, 2492, 2493, 2494, 2495, 2496, 2497, 2498, 2499, 2500, 2501, 2502, 2503, 2504, 2505, 2506, 2507, 2508, 2509, 2510, 2511, 2512, 2513, 2514, 2515, 2516, 2517, 2518, 2519, 2520, 2521, 2522, 2523, 2524, 2525, 2526, 2527, 2528, 2529, 2530, 2531, 2532, 2533, 2534, 2535, 2536, 2537, 2538, 2539, 2540, 2541, 2542, 2543, 2544, 2545, 2546, 2547, 2548, 2549, 2550, 2551, 2552, 2553, 2554, 2555, 2556, 2557, 2558, 2559, 2560, 2561, 2562, 2563, 2564, 2565, 2566, 2567, 2568, 2569, 2570, 2571, 2572, 2573, 2574, 2575, 2576, 2577, 2578, 2579, 2580, 2581, 2582, 2583, 2584, 2585, 2586, 2587, 2588, 2589, 2590, 2591, 2592, 2593, 2594, 2595, 2596, 2597, 2598, 2599, 2600, 2601, 2602, 2603, 2604, 2605, 2606, 2607, 2608, 2609, 2610, 2611, 2612, 2613, 2614, 2615, 2616, 2617, 2618, 2619, 2620, 2621, 2622, 2623, 2624, 2625, 2626, 2627, 2628, 2629, 2630, 2631, 2632, 2633, 2634, 2635, 2636, 2637, 2638, 2639, 2640, 2641, 2642, 2643, 2644, 2645, 2646, 2647, 2648, 2649, 2650, 2651, 2652, 2653, 2654, 2655, 2656, 2657, 2658, 2659, 2660, 2661, 2662, 2663, 2664, 2665, 2666, 2667, 2668, 2669, 2670, 2671, 2672, 2673, 2674, 2675, 2676, 2677, 2678, 2679, 2680, 2681, 2682, 2683, 2684, 2685, 2686, 2687, 2688, 2689, 2690, 2691, 2692, 2693, 2694, 2695, 2696, 2697, 2698, 2699, 2700, 2701, 2702, 2703, 2704, 2705, 2706, 2707, 2708, 2709, 2710, 2711, 2712, 2713, 2714, 2715, 2716, 2717, 2718, 2719, 2720, 2721, 2722, 2723, 2724, 2725, 2726, 2727, 2728, 2729, 2730, 2731, 2732, 2733, 2734, 2735, 2736, 2737, 2738, 2739, 2740, 2741, 2742, 2743, 2744, 2745, 2746, 2747, 2748, 2749, 2750, 2751, 2752, 2753, 2754, 2755, 2756, 2757, 2758, 2759, 2760, 2761, 2762, 2763, 2764, 2765, 2766, 2767, 2768, 2769, 2770, 2771, 2772, 2773, 2774, 2775, 2776, 2777, 2778, 2779, 2780, 2781, 2782, 2783, 2784, 2785, 2786, 2787, 2788, 2789, 2790, 2791, 2792, 2793, 2794, 2795, 2796, 2797, 2798, 2799, 2800, 2801, 2802, 2803, 2804, 2805, 2806, 2807, 2808, 2809, 2810, 2811, 2812, 2813, 2814, 2815, 2816, 2817, 2818, 2819, 2820, 2821, 2822, 2823, 2824, 2825, 2826, 2827, 2828, 2829, 2830, 2831, 2832, 2833, 2834, 2835, 2836, 2837, 2838, 2839, 2840, 2841, 2842, 2843, 2844, 2845, 2846, 2847, 2848, 2849, 2850, 2851, 2852, 2853, 2854, 2855, 2856, 2857, 2858, 2859, 2860, 2861, 2862, 2863, 2864, 2865, 2866, 2867, 2868, 2869, 2870, 2871, 2872, 2873, 2874, 2875, 2876, 2877, 2878, 2879, 2880, 2881, 2882, 2883, 2884, 2885, 2886, 2887, 2888, 2889, 2890, 2891, 2892, 2893, 2894, 2895, 2896, 2897, 2898, 2899, 2900, 2901, 2902, 2903, 2904, 2905, 2906, 2907, 2908, 2909, 2910, 2911, 2912, 2913, 2914, 2915, 2916, 2917, 2918, 2919, 2920, 2921, 2922, 2923, 2924, 2925, 2926, 2927, 2928, 2929, 2930, 2931, 2932, 2933, 2934, 2935, 2936, 2937, 2938, 2939, 2940, 2941, 2942, 2943, 2944, 2945, 2946, 2947, 2948, 2949, 2950, 2951, 2952, 2953, 2954, 2955, 2956, 2957, 2958, 2959, 2960, 2961, 2962, 2963, 2964, 2965, 2966, 2967, 2968, 2969, 2970, 2971, 2972, 2973, 2974, 2975, 2976, 2977, 2978, 2979, 2980, 2981, 2982, 2983, 2984, 2985, 2986, 2987, 2988, 2989, 2990, 2991, 2992, 2993, 2994, 2995, 2996, 2997, 2998, 2999, 3000, 3001, 3002, 3003, 3004, 3005, 3006, 3007, 3008, 3009, 3010, 3011, 3012, 3013, 3014, 3015, 3016, 3017, 3018, 3019, 3020, 3021, 3022, 3023, 3024, 3025, 3026, 3027, 3028, 3029, 3030, 3031, 3032, 3033, 3034, 3035, 3036, 3037, 3038, 3039, 3040, 3041, 3042, 3043, 3044, 3045, 3046, 3047, 3048, 3049, 3050, 3051, 3052, 3053, 3054, 3055, 3056, 3057, 3058, 3059, 3060, 3061, 3062, 3063, 3064, 3065, 3066, 3067, 3068, 3069, 3070, 3071, 3072, 3073, 3074, 3075, 3076, 3077, 3078, 3079, 3080, 3081, 3082, 3083, 3084, 3085, 3086, 3087, 3088, 3089, 3090, 3091, 3092, 3093, 3094, 3095, 3096, 3097, 3098, 3099, 3100, 3101, 3102, 3103, 3104, 3105, 3106, 3107, 3108, 3109, 3110, 3111, 3112, 3113, 3114, 3115, 3116, 3117, 3118, 3119, 3120, 3121, 3122, 3123, 3124, 3125, 3126, 3127, 3128, 3129, 3130, 3131, 3132, 3133, 3134, 3135, 3136, 3137, 3138, 3139, 3140, 3141, 3142, 3143, 3144, 3145, 3146, 3147, 3148, 3149, 3150, 3151, 3152, 3153, 3154, 3155, 3156, 3157, 3158, 3159, 3160, 3161, 3162, 3163, 3164, 3165, 3166, 3167, 3168, 3169, 3170, 3171, 3172, 3173, 3174, 3175, 3176, 3177, 3178, 3179, 3180, 3181, 3182, 3183, 3184, 3185, 3186, 3187, 3188, 3189, 3190, 3191, 3192, 3193, 3194, 3195, 3196, 3197, 3198, 3199, 3200, 3201, 3202, 3203, 3204, 3205, 3206, 3207, 3208, 3209, 3210, 3211, 3212, 3213, 3214, 3215, 3216, 3217, 3218, 3219, 3220, 3221, 3222, 3223, 3224, 3225, 3226, 3227, 3228, 3229, 3230, 3231, 3232, 3233, 3234, 3235, 3236, 3237, 3238, 3239, 3240, 3241, 3242, 3243, 3244, 3245, 3246, 3247, 3248, 3249, 3250, 3251, 3252, 3253, 3254, 3255, 3256, 3257, 3258, 3259, 3260, 3261, 3262, 3263, 3264, 3265, 3266, 3267, 3268, 3269, 3270, 3271, 3272, 3273, 3274, 3275, 3276, 3277, 3278, 3279, 3280, 3281, 3282, 3283, 3284, 3285, 3286, 3287, 3288, 3289, 3290, 3291, 3292, 3293, 3294, 3295, 3296, 3297, 3298, 3299, 3300, 3301, 3302, 3303, 3304, 3305, 3306, 3307, 3308, 3309, 3310, 3311, 3312, 3313, 3314, 3315, 3316, 3317, 3318, 3319, 3320, 3321, 3322, 3323, 3324, 3325, 3326, 3327, 3328, 3329, 3330, 3331, 3332, 3333, 3334, 3335, 3336, 3337, 3338, 3339, 3340, 3341, 3342, 3343, 3344, 3345, 3346, 3347, 3348, 3349, 3350, 3351, 3352, 3353, 3354, 3355, 3356, 3357, 3358, 3359, 3360, 3361, 3362, 3363, 3364, 3365, 3366, 3367, 3368, 3369, 3370, 3371, 3372, 3373, 3374, 3375, 3376, 3377, 3378, 3379, 3380, 3381, 3382, 3383, 3384, 3385, 3386, 3387, 3388, 3389, 3390, 3391, 3392, 3393, 3394, 3395, 3396, 3397, 3398, 3399, 3400, 3401, 3402, 3403, 3404, 3405, 3406, 3407, 3408, 3409, 3410, 3411, 3412, 3413, 3414, 3415, 3416, 3417, 3418, 3419, 3420, 3421, 3422, 3423, 3424, 3425, 3426, 3427, 3428, 3429, 3430, 3431, 3432, 3433, 3434, 3435, 3436, 3437, 3438, 3439, 3440, 3441, 3442, 3443, 3444, 3445, 3446, 3447, 3448, 3449, 3450, 3451, 3452, 3453, 3454, 3455, 3456, 3457, 3458, 3459, 3460, 3461, 3462, 3463, 3464, 3465, 3466, 3467, 3468, 3469, 3470, 3471, 3472, 3473, 3474, 3475, 3476, 3477, 3478, 3479, 3480, 3481, 3482, 3483, 3484, 3485, 3486, 3487, 3488, 3489, 3490, 3491, 3492, 3493, 3494, 3495, 3496, 3497, 3498, 3499, 3500, 3501, 3502, 3503, 3504, 3505, 3506, 3507, 3508, 3509, 3510, 3511, 3512, 3513, 3514, 3515, 3516, 3517, 3518, 3519, 3520, 3521, 3522, 3523, 3524, 3525, 3526, 3527, 3528, 3529, 3530, 3531, 3532, 3533, 3534, 3535, 3536, 3537, 3538, 3539, 3540, 3541, 3542, 3543, 3544, 3545, 3546, 3547, 3548, 3549, 3550, 3551, 3552, 3553, 3554, 3555, 3556, 3557, 3558, 3559, 3560, 3561, 3562, 3563, 3564, 3565, 3566, 3567, 3568, 3569, 3570, 3571, 3572, 3573, 3574, 3575, 3576, 3577, 3578, 3579, 3580, 3581, 3582, 3583, 3584, 3585, 3586, 3587, 3588, 3589, 3590, 3591, 3592, 3593, 3594, 3595, 3596, 3597, 3598, 3599, 3600, 3601, 3602, 3603, 3604, 3605, 3606, 3607, 3608, 3609, 3610, 3611, 3612, 3613, 3614, 3615, 3616, 3617, 3618, 3619, 3620, 3621, 3622, 3623, 3624, 3625, 3626, 3627, 3628, 3629, 3630, 3631, 3632, 3633, 3634, 3635, 3636, 3637, 3638, 3639, 3640, 3641, 3642, 3643, 3644, 3645, 3646, 3647, 3648, 3649, 3650, 3651, 3652, 3653, 3654, 3655, 3656, 3657, 3658, 3659, 3660, 3661, 3662, 3663, 3664, 3665, 3666, 3667, 3668, 3669, 3670, 3671, 3672, 3673, 3674, 3675, 3676, 3677, 3678, 3679, 3680, 3681, 3682, 3683, 3684, 3685, 3686, 3687, 3688, 3689, 3690, 3691, 3692, 3693, 3694, 3695, 3696, 3697, 3698, 3699, 3700, 3701, 3702, 3703, 3704, 3705, 3706, 3707, 3708, 3709, 3710, 3711, 3712, 3713, 3714, 3715, 3716, 3717, 3718, 3719, 3720, 3721, 3722, 3723, 3724, 3725, 3726, 3727, 3728, 3729, 3730, 3731, 3732, 3733, 3734, 3735, 3736, 3737, 3738, 3739, 3740, 3741, 3742, 3743, 3744, 3745, 3746, 3747, 3748, 3749, 3750, 3751, 3752, 3753, 3754, 3755, 3756, 3757, 3758, 3759, 3760, 3761, 3762, 3763, 3764, 3765, 3766, 3767, 3768, 3769, 3770, 3771, 3772, 3773, 3774, 3775, 3776, 3777, 3778, 3779, 3780, 3781, 3782, 3783, 3784, 3785, 3786, 3787, 3788, 3789, 3790, 3791, 3792, 3793, 3794, 3795, 3796, 3797, 3798, 3799, 3800, 3801, 3802, 3803, 3804, 3805, 3806, 3807, 3808, 3809, 3810, 3811, 3812, 3813, 3814, 3815, 3816, 3817, 3818, 3819, 3820, 3821, 3822, 3823, 3824, 3825, 3826, 3827, 3828, 3829, 3830, 3831, 3832, 3833, 3834, 3835, 3836, 3837, 3838, 3839, 3840, 3841, 3842, 3843, 3844, 3845, 3846, 3847, 3848, 3849, 3850, 3851, 3852, 3853, 3854, 3855, 3856, 3857, 3858, 3859, 3860, 3861, 3862, 3863, 3864, 3865, 3866, 3867, 3868, 3869, 3870, 3871, 3872, 3873, 3874, 3875, 3876, 3877, 3878, 3879, 3880, 3881, 3882, 3883, 3884, 3885, 3886, 3887, 3888, 3889, 3890, 3891, 3892, 3893, 3894, 3895, 3896, 3897, 3898, 3899, 3900, 3901, 3902, 3903, 3904, 3905, 3906, 3907, 3908, 3909, 3910, 3911, 3912, 3913, 3914, 3915, 3916, 3917, 3918, 3919, 3920, 3921, 3922, 3923, 3924, 3925, 3926, 3927, 3928, 3929, 3930, 3931, 3932, 3933, 3934, 3935, 3936, 3937, 3938, 3939, 3940, 3941, 3942, 3943, 3944, 3945, 3946, 3947, 3948, 3949, 3950, 3951, 3952, 3953, 3954, 3955, 3956, 3957, 3958, 3959, 3960, 3961, 3962, 3963, 3964, 3965, 3966, 3967, 3968, 3969, 3970, 3971, 3972, 3973, 3974, 3975, 3976, 3977, 3978, 3979, 3980, 3981, 3982, 3983, 3984, 3985, 3986, 3987, 3988, 3989, 3990, 3991, 3992, 3993, 3994, 3995, 3996, 3997, 3998, 3999, 4000, 4001, 4002, 4003, 4004, 4005, 4006, 4007, 4008, 4009, 4010, 4011, 4012, 4013, 4014, 4015, 4016, 4017, 4018, 4019, 4020, 4021, 4022, 4023, 4024, 4025, 4026, 4027, 4028, 4029, 4030, 4031, 4032, 4033, 4034, 4035, 4036, 4037, 4038, 4039, 4040, 4041, 4042, 4043, 4044, 4045, 4046, 4047, 4048, 4049, 4050, 4051, 4052, 4053, 4054, 4055, 4056, 4057, 4058, 4059, 4060, 4061, 4062, 4063, 4064, 4065, 4066, 4067, 4068, 4069, 4070, 4071, 4072, 4073, 4074, 4075, 4076, 4077, 4078, 4079, 4080, 4081, 4082, 4083, 4084, 4085, 4086, 4087, 4088, 4089, 4090, 4091, 4092, 4093, 4094, 4095, 4096, 4097, 4098, 4099, 4100, 4101, 4102, 4103, 4104, 4105, 4106, 4107, 4108, 4109, 4110, 4111, 4112, 4113, 4114, 4115, 4116, 4117, 4118, 4119, 4120, 4121, 4122, 4123, 4124, 4125, 4126, 4127, 4128, 4129, 4130, 4131, 4132, 4133, 4134, 4135, 4136, 4137, 4138, 4139, 4140, 4141, 4142, 4143, 4144, 4145, 4146, 4147, 4148, 4149, 4150, 4151, 4152, 4153, 4154, 4155, 4156, 4157, 4158, 4159, 4160, 4161, 4162, 4163, 4164, 4165, 4166, 4167, 4168, 4169, 4170, 4171, 4172, 4173, 4174, 4175, 4176, 4177, 4178, 4179, 4180, 4181, 4182, 4183, 4184, 4185, 4186, 4187, 4188, 4189, 4190, 4191, 4192, 4193, 4194, 4195, 4196, 4197, 4198, 4199, 4200, 4201, 4202, 4203, 4204, 4205, 4206, 4207, 4208, 4209, 4210, 4211, 4212, 4213, 4214, 4215, 4216, 4217, 4218, 4219, 4220, 4221, 4222, 4223, 4224, 4225, 4226, 4227, 4228, 4229, 4230, 4231, 4232, 4233, 4234, 4235, 4236, 4237, 4238, 4239, 4240, 4241, 4242, 4243, 4244, 4245, 4246, 4247, 4248, 4249, 4250, 4251, 4252, 4253, 4254, 4255, 4256, 4257, 4258, 4259, 4260, 4261, 4262, 4263, 4264, 4265, 4266, 4267, 4268, 4269, 4270, 4271, 4272, 4273, 4274, 4275, 4276, 4277, 4278, 4279, 4280, 4281, 4282, 4283, 4284, 4285, 4286, 4287, 4288, 4289, 4290, 4291, 4292, 4293, 4294, 4295, 4296, 4297, 4298, 4299, 4300, 4301, 4302, 4303, 4304, 4305, 4306, 4307, 4308, 4309, 4310, 4311, 4312, 4313, 4314, 4315, 4316, 4317, 4318, 4319, 4320, 4321, 4322, 4323, 4324, 4325, 4326, 4327, 4328, 4329, 4330, 4331, 4332, 4333, 4334, 4335, 4336, 4337, 4338, 4339, 4340, 4341, 4342, 4343, 4344, 4345, 4346, 4347, 4348, 4349, 4350, 4351, 4352, 4353, 4354, 4355, 4356, 4357, 4358, 4359, 4360, 4361, 4362, 4363, 4364, 4365, 4366, 4367, 4368, 4369, 4370, 4371, 4372, 4373, 4374, 4375, 4376, 4377, 4378, 4379, 4380, 4381, 4382, 4383, 4384, 4385, 4386, 4387, 4388, 4389, 4390, 4391, 4392, 4393, 4394, 4395, 4396, 4397, 4398, 4399, 4400, 4401, 4402, 4403, 4404, 4405, 4406, 4407, 4408, 4409, 4410, 4411, 4412, 4413, 4414, 4415, 4416, 4417, 4418, 4419, 4420, 4421, 4422, 4423, 4424, 4425, 4426, 4427, 4428, 4429, 4430, 4431, 4432, 4433, 4434, 4435, 4436, 4437, 4438, 4439, 4440, 4441, 4442, 4443, 4444, 4445, 4446, 4447, 4448, 4449, 4450, 4451, 4452, 4453, 4454, 4455, 4456, 4457, 4458, 4459, 4460, 4461, 4462, 4463, 4464, 4465, 4466, 4467, 4468, 4469, 4470, 4471, 4472, 4473, 4474, 4475, 4476, 4477, 4478, 4479, 4480, 4481, 4482, 4483, 4484, 4485, 4486, 4487, 4488, 4489, 4490, 4491, 4492, 4493, 4494, 4495, 4496, 4497, 4498, 4499, 4500, 4501, 4502, 4503, 4504, 4505, 4506, 4507, 4508, 4509, 4510, 4511, 4512, 4513, 4514, 4515, 4516, 4517, 4518, 4519, 4520, 4521, 4522, 4523, 4524, 4525, 4526, 4527, 4528, 4529, 4530, 4531, 4532, 4533, 4534, 4535, 4536, 4537, 4538, 4539, 4540, 4541, 4542, 4543, 4544, 4545, 4546, 4547, 4548, 4549, 4550, 4551, 4552, 4553, 4554, 4555, 4556, 4557, 4558, 4559, 4560, 4561, 4562, 4563, 4564, 4565, 4566, 4567, 4568, 4569, 4570, 4571, 4572, 4573, 4574, 4575, 4576, 4577, 4578, 4579, 4580, 4581, 4582, 4583, 4584, 4585, 4586, 4587, 4588, 4589, 4590, 4591, 4592, 4593, 4594, 4595, 4596, 4597, 4598, 4599, 4600, 4601, 4602, 4603, 4604, 4605, 4606, 4607, 4608, 4609, 4610, 4611, 4612, 4613, 4614, 4615, 4616, 4617, 4618, 4619, 4620, 4621, 4622, 4623, 4624, 4625, 4626, 4627, 4628, 4629, 4630, 4631, 4632, 4633, 4634, 4635, 4636, 4637, 4638, 4639, 4640, 4641, 4642, 4643, 4644, 4645, 4646, 4647, 4648, 4649, 4650, 4651, 4652, 4653, 4654, 4655, 4656, 4657, 4658, 4659, 4660, 4661, 4662, 4663, 4664, 4665, 4666, 4667, 4668, 4669, 4670, 4671, 4672, 4673, 4674, 4675, 4676, 4677, 4678, 4679, 4680, 4681, 4682, 4683, 4684, 4685, 4686, 4687, 4688, 4689, 4690, 4691, 4692, 4693, 4694, 4695, 4696, 4697, 4698, 4699, 4700, 4701, 4702, 4703, 4704, 4705, 4706, 4707, 4708, 4709, 4710, 4711, 4712, 4713, 4714, 4715, 4716, 4717, 4718, 4719, 4720, 4721, 4722, 4723, 4724, 4725, 4726, 4727, 4728, 4729, 4730, 4731, 4732, 4733, 4734, 4735, 4736, 4737, 4738, 4739, 4740, 4741, 4742, 4743, 4744, 4745, 4746, 4747, 4748, 4749, 4750, 4751, 4752, 4753, 4754, 4755, 4756, 4757, 4758, 4759, 4760, 4761, 4762, 4763, 4764, 4765, 4766, 4767, 4768, 4769, 4770, 4771, 4772, 4773, 4774, 4775, 4776, 4777, 4778, 4779, 4780, 4781, 4782, 4783, 4784, 4785, 4786, 4787, 4788, 4789, 4790, 4791, 4792, 4793, 4794, 4795, 4796, 4797, 4798, 4799, 4800, 4801, 4802, 4803, 4804, 4805, 4806, 4807, 4808, 4809, 4810, 4811, 4812, 4813, 4814, 4815, 4816, 4817, 4818, 4819, 4820, 4821, 4822, 4823, 4824, 4825, 4826, 4827, 4828, 4829, 4830, 4831, 4832, 4833, 4834, 4835, 4836, 4837, 4838, 4839, 4840, 4841, 4842, 4843, 4844, 4845, 4846, 4847, 4848, 4849, 4850, 4851, 4852, 4853, 4854, 4855, 4856, 4857, 4858, 4859, 4860, 4861, 4862, 4863, 4864, 4865, 4866, 4867, 4868, 4869, 4870, 4871, 4872, 4873, 4874, 4875, 4876, 4877, 4878, 4879, 4880, 4881, 4882, 4883, 4884, 4885, 4886, 4887, 4888, 4889, 4890, 4891, 4892, 4893, 4894, 4895, 4896, 4897, 4898, 4899, 4900, 4901, 4902, 4903, 4904, 4905, 4906, 4907, 4908, 4909, 4910, 4911, 4912, 4913, 4914, 4915, 4916, 4917, 4918, 4919, 4920, 4921, 4922, 4923, 4924, 4925, 4926, 4927, 4928, 4929, 4930, 4931, 4932, 4933, 4934, 4935, 4936, 4937, 4938, 4939, 4940, 4941, 4942, 4943, 4944, 4945, 4946, 4947, 4948, 4949, 4950, 4951, 4952, 4953, 4954, 4955, 4956, 4957, 4958, 4959, 4960, 4961, 4962, 4963, 4964, 4965, 4966, 4967, 4968, 4969, 4970, 4971, 4972, 4973, 4974, 4975, 4976, 4977, 4978, 4979, 4980, 4981, 4982, 4983, 4984, 4985, 4986, 4987, 4988, 4989, 4990, 4991, 4992, 4993, 4994, 4995, 4996, 4997, 4998, 4999, 5000, 5001, 5002, 5003, 5004, 5005, 5006, 5007, 5008, 5009, 5010, 5011, 5012, 5013, 5014, 5015, 5016, 5017, 5018, 5019, 5020, 5021, 5022, 5023, 5024, 5025, 5026, 5027, 5028, 5029, 5030, 5031, 5032, 5033, 5034, 5035, 5036, 5037, 5038, 5039, 5040, 5041, 5042, 5043, 5044, 5045, 5046, 5047, 5048, 5049, 5050, 5051, 5052, 5053, 5054, 5055, 5056, 5057, 5058, 5059, 5060, 5061, 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, 5072, 5073, 5074, 5075, 5076, 5077, 5078, 5079, 5080, 5081, 5082, 5083, 5084, 5085, 5086, 5087, 5088, 5089, 5090, 5091, 5092, 5093, 5094, 5095, 5096, 5097, 5098, 5099, 5100, 5101, 5102, 5103, 5104, 5105, 5106, 5107, 5108, 5109, 5110, 5111, 5112, 5113, 5114, 5115, 5116, 5117, 5118, 5119, 5120, 5121, 5122, 5123, 5124, 5125, 5126, 5127, 5128, 5129, 5130, 5131, 5132, 5133, 5134, 5135, 5136, 5137, 5138, 5139, 5140, 5141, 5142, 5143, 5144, 5145, 5146, 5147, 5148, 5149, 5150, 5151, 5152, 5153, 5154, 5155, 5156, 5157, 5158, 5159, 5160, 5161, 5162, 5163, 5164, 5165, 5166, 5167, 5168, 5169, 5170, 5171, 5172, 5173, 5174, 5175, 5176, 5177, 5178, 5179, 5180, 5181, 5182, 5183, 5184, 5185, 5186, 5187, 5188, 5189, 5190, 5191, 5192, 5193, 5194, 5195, 5196, 5197, 5198, 5199, 5200, 5201, 5202, 5203, 5204, 5205, 5206, 5207, 5208, 5209, 5210, 5211, 5212, 5213, 5214, 5215, 5216, 5217, 5218, 5219, 5220, 5221, 5222, 5223, 5224, 5225, 5226, 5227, 5228, 5229, 5230, 5231, 5232, 5233, 5234, 5235, 5236, 5237, 5238, 5239, 5240, 5241, 5242, 5243, 5244, 5245, 5246, 5247, 5248, 5249, 5250, 5251, 5252, 5253, 5254, 5255, 5256, 5257, 5258, 5259, 5260, 5261, 5262, 5263, 5264, 5265, 5266, 5267, 5268, 5269, 5270, 5271, 5272, 5273, 5274, 5275, 5276, 5277, 5278, 5279, 5280, 5281, 5282, 5283, 5284, 5285, 5286, 5287, 5288, 5289, 5290, 5291, 5292, 5293, 5294, 5295, 5296, 5297, 5298, 5299, 5300, 5301, 5302, 5303, 5304, 5305, 5306, 5307, 5308, 5309, 5310, 5311, 5312, 5313, 5314, 5315, 5316, 5317, 5318, 5319, 5320, 5321, 5322, 5323, 5324, 5325, 5326, 5327, 5328, 5329, 5330, 5331, 5332, 5333, 5334, 5335, 5336, 5337, 5338, 5339, 5340, 5341, 5342, 5343, 5344, 5345, 5346, 5347, 5348, 5349, 5350, 5351, 5352, 5353, 5354, 5355, 5356, 5357, 5358, 5359, 5360, 5361, 5362, 5363, 5364, 5365, 5366, 5367, 5368, 5369, 5370, 5371, 5372, 5373, 5374, 5375, 5376, 5377, 5378, 5379, 5380, 5381, 5382, 5383, 5384, 5385, 5386, 5387, 5388, 5389, 5390, 5391, 5392, 5393, 5394, 5395, 5396, 5397, 5398, 5399, 5400, 5401, 5402, 5403, 5404, 5405, 5406, 5407, 5408, 5409, 5410, 5411, 5412, 5413, 5414, 5415, 5416, 5417, 5418, 5419, 5420, 5421, 5422, 5423, 5424, 5425, 5426, 5427, 5428, 5429, 5430, 5431, 5432, 5433, 5434, 5435, 5436, 5437, 5438, 5439, 5440, 5441, 5442, 5443, 5444, 5445, 5446, 5447, 5448, 5449, 5450, 5451, 5452, 5453, 5454, 5455, 5456, 5457, 5458, 5459, 5460, 5461, 5462, 5463, 5464, 5465, 5466, 5467, 5468, 5469, 5470, 5471, 5472, 5473, 5474, 5475, 5476, 5477, 5478, 5479, 5480, 5481, 5482, 5483, 5484, 5485, 5486, 5487, 5488, 5489, 5490, 5491, 5492, 5493, 5494, 5495, 5496, 5497, 5498, 5499, 5500, 5501, 5502, 5503, 5504, 5505, 5506, 5507, 5508, 5509, 5510, 5511, 5512, 5513, 5514, 5515, 5516, 5517, 5518, 5519, 5520, 5521, 5522, 5523, 5524, 5525, 5526, 5527, 5528, 5529, 5530, 5531, 5532, 5533, 5534, 5535, 5536, 5537, 5538, 5539, 5540, 5541, 5542, 5543, 5544, 5545, 5546, 5547, 5548, 5549, 5550, 5551, 5552, 5553, 5554, 5555, 5556, 5557, 5558, 5559, 5560, 5561, 5562, 5563, 5564, 5565, 5566, 5567, 5568, 5569, 5570, 5571, 5572, 5573, 5574, 5575, 5576, 5577, 5578, 5579, 5580, 5581, 5582, 5583, 5584, 5585, 5586, 5587, 5588, 5589, 5590, 5591, 5592, 5593, 5594, 5595, 5596, 5597, 5598, 5599, 5600, 5601, 5602, 5603, 5604, 5605, 5606, 5607, 5608, 5609, 5610, 5611, 5612, 5613, 5614, 5615, 5616, 5617, 5618, 5619, 5620, 5621, 5622, 5623, 5624, 5625, 5626, 5627, 5628, 5629, 5630, 5631, 5632, 5633, 5634, 5635, 5636, 5637, 5638, 5639, 5640, 5641, 5642, 5643, 5644, 5645, 5646, 5647, 5648, 5649, 5650, 5651, 5652, 5653, 5654, 5655, 5656, 5657, 5658, 5659, 5660, 5661, 5662, 5663, 5664, 5665, 5666, 5667, 5668, 5669, 5670, 5671, 5672, 5673, 5674, 5675, 5676, 5677, 5678, 5679, 5680, 5681, 5682, 5683, 5684, 5685, 5686, 5687, 5688, 5689, 5690, 5691, 5692, 5693, 5694, 5695, 5696, 5697, 5698, 5699, 5700, 5701, 5702, 5703, 5704, 5705, 5706, 5707, 5708, 5709, 5710, 5711, 5712, 5713, 5714, 5715, 5716, 5717, 5718, 5719, 5720, 5721, 5722, 5723, 5724, 5725, 5726, 5727, 5728, 5729, 5730, 5731, 5732, 5733, 5734, 5735, 5736, 5737, 5738, 5739, 5740, 5741, 5742, 5743, 5744, 5745, 5746, 5747, 5748, 5749, 5750, 5751, 5752, 5753, 5754, 5755, 5756, 5757, 5758, 5759, 5760, 5761, 5762, 5763, 5764, 5765, 5766, 5767, 5768, 5769, 5770, 5771, 5772, 5773, 5774, 5775, 5776, 5777, 5778, 5779, 5780, 5781, 5782, 5783, 5784, 5785, 5786, 5787, 5788, 5789, 5790, 5791, 5792, 5793, 5794, 5795, 5796, 5797, 5798, 5799, 5800, 5801, 5802, 5803, 5804, 5805, 5806, 5807, 5808, 5809, 5810, 5811, 5812, 5813, 5814, 5815, 5816, 5817, 5818, 5819, 5820, 5821, 5822, 5823, 5824, 5825, 5826, 5827, 5828, 5829, 5830, 5831, 5832, 5833, 5834, 5835, 5836, 5837, 5838, 5839, 5840, 5841, 5842, 5843, 5844, 5845, 5846, 5847, 5848, 5849, 5850, 5851, 5852, 5853, 5854, 5855, 5856, 5857, 5858, 5859, 5860, 5861, 5862, 5863, 5864, 5865, 5866, 5867, 5868, 5869, 5870, 5871, 5872, 5873, 5874, 5875, 5876, 5877, 5878, 5879, 5880, 5881, 5882, 5883, 5884, 5885, 5886, 5887, 5888, 5889, 5890, 5891, 5892, 5893, 5894, 5895, 5896, 5897, 5898, 5899, 5900, 5901, 5902, 5903, 5904, 5905, 5906, 5907, 5908, 5909, 5910, 5911, 5912, 5913, 5914, 5915, 5916, 5917, 5918, 5919, 5920, 5921, 5922, 5923, 5924, 5925, 5926, 5927, 5928, 5929, 5930, 5931, 5932, 5933, 5934, 5935, 5936, 5937, 5938, 5939, 5940, 5941, 5942, 5943, 5944, 5945, 5946, 5947, 5948, 5949, 5950, 5951, 5952, 5953, 5954, 5955, 5956, 5957, 5958, 5959, 5960, 5961, 5962, 5963, 5964, 5965, 5966, 5967, 5968, 5969, 5970, 5971, 5972, 5973, 5974, 5975, 5976, 5977, 5978, 5979, 5980, 5981, 5982, 5983, 5984, 5985, 5986, 5987, 5988, 5989, 5990, 5991, 5992, 5993, 5994, 5995, 5996, 5997, 5998, 5999, 6000, 6001, 6002, 6003, 6004, 6005, 6006, 6007, 6008, 6009, 6010, 6011, 6012, 6013, 6014, 6015, 6016, 6017, 6018, 6019, 6020, 6021, 6022, 6023, 6024, 6025, 6026, 6027, 6028, 6029, 6030, 6031, 6032, 6033, 6034, 6035, 6036, 6037, 6038, 6039, 6040, 6041, 6042, 6043, 6044, 6045, 6046, 6047, 6048, 6049, 6050, 6051, 6052, 6053, 6054, 6055, 6056, 6057, 6058, 6059, 6060, 6061, 6062, 6063, 6064, 6065, 6066, 6067, 6068, 6069, 6070, 6071, 6072, 6073, 6074, 6075, 6076, 6077, 6078, 6079, 6080, 6081, 6082, 6083, 6084, 6085, 6086, 6087, 6088, 6089, 6090, 6091, 6092, 6093, 6094, 6095, 6096, 6097, 6098, 6099, 6100, 6101, 6102, 6103, 6104, 6105, 6106, 6107, 6108, 6109, 6110, 6111, 6112, 6113, 6114, 6115, 6116, 6117, 6118, 6119, 6120, 6121, 6122, 6123, 6124, 6125, 6126, 6127, 6128, 6129, 6130, 6131, 6132, 6133, 6134, 6135, 6136, 6137, 6138, 6139, 6140, 6141, 6142, 6143, 6144, 6145, 6146, 6147, 6148, 6149, 6150, 6151, 6152, 6153, 6154, 6155, 6156, 6157, 6158, 6159, 6160, 6161, 6162, 6163, 6164, 6165, 6166, 6167, 6168, 6169, 6170, 6171, 6172, 6173, 6174, 6175, 6176, 6177, 6178, 6179, 6180, 6181, 6182, 6183, 6184, 6185, 6186, 6187, 6188, 6189, 6190, 6191, 6192, 6193, 6194, 6195, 6196, 6197, 6198, 6199, 6200, 6201, 6202, 6203, 6204, 6205, 6206, 6207, 6208, 6209, 6210, 6211, 6212, 6213, 6214, 6215, 6216, 6217, 6218, 6219, 6220, 6221, 6222, 6223, 6224, 6225, 6226, 6227, 6228, 6229, 6230, 6231, 6232, 6233, 6234, 6235, 6236, 6237, 6238, 6239, 6240, 6241, 6242, 6243, 6244, 6245, 6246, 6247, 6248, 6249, 6250, 6251, 6252, 6253, 6254, 6255, 6256, 6257, 6258, 6259, 6260, 6261, 6262, 6263, 6264, 6265, 6266, 6267, 6268, 6269, 6270, 6271, 6272, 6273, 6274, 6275, 6276, 6277, 6278, 6279, 6280, 6281, 6282, 6283, 6284, 6285, 6286, 6287, 6288, 6289, 6290, 6291, 6292, 6293, 6294, 6295, 6296, 6297, 6298, 6299, 6300, 6301, 6302, 6303, 6304, 6305, 6306, 6307, 6308, 6309, 6310, 6311, 6312, 6313, 6314, 6315, 6316, 6317, 6318, 6319, 6320, 6321, 6322, 6323, 6324, 6325, 6326, 6327, 6328, 6329, 6330, 6331, 6332, 6333, 6334, 6335, 6336, 6337, 6338, 6339, 6340, 6341, 6342, 6343, 6344, 6345, 6346, 6347, 6348, 6349, 6350, 6351, 6352, 6353, 6354, 6355, 6356, 6357, 6358, 6359, 6360, 6361, 6362, 6363, 6364, 6365, 6366, 6367, 6368, 6369, 6370, 6371, 6372, 6373, 6374, 6375, 6376, 6377, 6378, 6379, 6380, 6381, 6382, 6383, 6384, 6385, 6386, 6387, 6388, 6389, 6390, 6391, 6392, 6393, 6394, 6395, 6396, 6397, 6398, 6399, 6400, 6401, 6402, 6403, 6404, 6405, 6406, 6407, 6408, 6409, 6410, 6411, 6412, 6413, 6414, 6415, 6416, 6417, 6418, 6419, 6420, 6421, 6422, 6423, 6424, 6425, 6426, 6427, 6428, 6429, 6430, 6431, 6432, 6433, 6434, 6435, 6436, 6437, 6438, 6439, 6440, 6441, 6442, 6443, 6444, 6445, 6446, 6447, 6448, 6449, 6450, 6451, 6452, 6453, 6454, 6455, 6456, 6457, 6458, 6459, 6460, 6461, 6462, 6463, 6464, 6465, 6466, 6467, 6468, 6469, 6470, 6471, 6472, 6473, 6474, 6475, 6476, 6477, 6478, 6479, 6480, 6481, 6482, 6483, 6484, 6485, 6486, 6487, 6488, 6489, 6490, 6491, 6492, 6493, 6494, 6495, 6496, 6497, 6498, 6499, 6500, 6501, 6502, 6503, 6504, 6505, 6506, 6507, 6508, 6509, 6510, 6511, 6512, 6513, 6514, 6515, 6516, 6517, 6518, 6519, 6520, 6521, 6522, 6523, 6524, 6525, 6526, 6527, 6528, 6529, 6530, 6531, 6532, 6533, 6534, 6535, 6536, 6537, 6538, 6539, 6540, 6541, 6542, 6543, 6544, 6545, 6546, 6547, 6548, 6549, 6550, 6551, 6552, 6553, 6554, 6555, 6556, 6557, 6558, 6559, 6560, 6561, 6562, 6563, 6564, 6565, 6566, 6567, 6568, 6569, 6570, 6571, 6572, 6573, 6574, 6575, 6576, 6577, 6578, 6579, 6580, 6581, 6582, 6583, 6584, 6585, 6586, 6587, 6588, 6589, 6590, 6591, 6592, 6593, 6594, 6595, 6596, 6597, 6598, 6599, 6600, 6601, 6602, 6603, 6604, 6605, 6606, 6607, 6608, 6609, 6610, 6611, 6612, 6613, 6614, 6615, 6616, 6617, 6618, 6619, 6620, 6621, 6622, 6623, 6624, 6625, 6626, 6627, 6628, 6629, 6630, 6631, 6632, 6633, 6634, 6635, 6636, 6637, 6638, 6639, 6640, 6641, 6642, 6643, 6644, 6645, 6646, 6647, 6648, 6649, 6650, 6651, 6652, 6653, 6654, 6655, 6656, 6657, 6658, 6659, 6660, 6661, 6662, 6663, 6664, 6665, 6666, 6667, 6668, 6669, 6670, 6671, 6672, 6673, 6674, 6675, 6676, 6677, 6678, 6679, 6680, 6681, 6682, 6683, 6684, 6685, 6686, 6687, 6688, 6689, 6690, 6691, 6692, 6693, 6694, 6695, 6696, 6697, 6698, 6699, 6700, 6701, 6702, 6703, 6704, 6705, 6706, 6707, 6708, 6709, 6710, 6711, 6712, 6713, 6714, 6715, 6716, 6717, 6718, 6719, 6720, 6721, 6722, 6723, 6724, 6725, 6726, 6727, 6728, 6729, 6730, 6731, 6732, 6733, 6734, 6735, 6736, 6737, 6738, 6739, 6740, 6741, 6742, 6743, 6744, 6745, 6746, 6747, 6748, 6749, 6750, 6751, 6752, 6753, 6754, 6755, 6756, 6757, 6758, 6759, 6760, 6761, 6762, 6763, 6764, 6765, 6766, 6767, 6768, 6769, 6770, 6771, 6772, 6773, 6774, 6775, 6776, 6777, 6778, 6779, 6780, 6781, 6782, 6783, 6784, 6785, 6786, 6787, 6788, 6789, 6790, 6791, 6792, 6793, 6794, 6795, 6796, 6797, 6798, 6799, 6800, 6801, 6802, 6803, 6804, 6805, 6806, 6807, 6808, 6809, 6810, 6811, 6812, 6813, 6814, 6815, 6816, 6817, 6818, 6819, 6820, 6821, 6822, 6823, 6824, 6825, 6826, 6827, 6828, 6829, 6830, 6831, 6832, 6833, 6834, 6835, 6836, 6837, 6838, 6839, 6840, 6841, 6842, 6843, 6844, 6845, 6846, 6847, 6848, 6849, 6850, 6851, 6852, 6853, 6854, 6855, 6856, 6857, 6858, 6859, 6860, 6861, 6862, 6863, 6864, 6865, 6866, 6867, 6868, 6869, 6870, 6871, 6872, 6873, 6874, 6875, 6876, 6877, 6878, 6879, 6880, 6881, 6882, 6883, 6884, 6885, 6886, 6887, 6888, 6889, 6890, 6891, 6892, 6893, 6894, 6895, 6896, 6897, 6898, 6899, 6900, 6901, 6902, 6903, 6904, 6905, 6906, 6907, 6908, 6909, 6910, 6911, 6912, 6913, 6914, 6915, 6916, 6917, 6918, 6919, 6920, 6921, 6922, 6923, 6924, 6925, 6926, 6927, 6928, 6929, 6930, 6931, 6932, 6933, 6934, 6935, 6936, 6937, 6938, 6939, 6940, 6941, 6942, 6943, 6944, 6945, 6946, 6947, 6948, 6949, 6950, 6951, 6952, 6953, 6954, 6955, 6956, 6957, 6958, 6959, 6960, 6961, 6962, 6963, 6964, 6965, 6966, 6967, 6968, 6969, 6970, 6971, 6972, 6973, 6974, 6975, 6976, 6977, 6978, 6979, 6980, 6981, 6982, 6983, 6984, 6985, 6986, 6987, 6988, 6989, 6990, 6991, 6992, 6993, 6994, 6995, 6996, 6997, 6998, 6999, 7000, 7001, 7002, 7003, 7004, 7005, 7006, 7007, 7008, 7009, 7010, 7011, 7012, 7013, 7014, 7015, 7016, 7017, 7018, 7019, 7020, 7021, 7022, 7023, 7024, 7025, 7026, 7027, 7028, 7029, 7030, 7031, 7032, 7033, 7034, 7035, 7036, 7037, 7038, 7039, 7040, 7041, 7042, 7043, 7044, 7045, 7046, 7047, 7048, 7049, 7050, 7051, 7052, 7053, 7054, 7055, 7056, 7057, 7058, 7059, 7060, 7061, 7062, 7063, 7064, 7065, 7066, 7067, 7068, 7069, 7070, 7071, 7072, 7073, 7074, 7075, 7076, 7077, 7078, 7079, 7080, 7081, 7082, 7083, 7084, 7085, 7086, 7087, 7088, 7089, 7090, 7091, 7092, 7093, 7094, 7095, 7096, 7097, 7098, 7099, 7100, 7101, 7102, 7103, 7104, 7105, 7106, 7107, 7108, 7109, 7110, 7111, 7112, 7113, 7114, 7115, 7116, 7117, 7118, 7119, 7120, 7121, 7122, 7123, 7124, 7125, 7126, 7127, 7128, 7129, 7130, 7131, 7132, 7133, 7134, 7135, 7136, 7137, 7138, 7139, 7140, 7141, 7142, 7143, 7144, 7145, 7146, 7147, 7148, 7149, 7150, 7151, 7152, 7153, 7154, 7155, 7156, 7157, 7158, 7159, 7160, 7161, 7162, 7163, 7164, 7165, 7166, 7167, 7168, 7169, 7170, 7171, 7172, 7173, 7174, 7175, 7176, 7177, 7178, 7179, 7180, 7181, 7182, 7183, 7184, 7185, 7186, 7187, 7188, 7189, 7190, 7191, 7192, 7193, 7194, 7195, 7196, 7197, 7198, 7199, 7200, 7201, 7202, 7203, 7204, 7205, 7206, 7207, 7208, 7209, 7210, 7211, 7212, 7213, 7214, 7215, 7216, 7217, 7218, 7219, 7220, 7221, 7222, 7223, 7224, 7225, 7226, 7227, 7228, 7229, 7230, 7231, 7232, 7233, 7234, 7235, 7236, 7237, 7238, 7239, 7240, 7241, 7242, 7243, 7244, 7245, 7246, 7247, 7248, 7249, 7250, 7251, 7252, 7253, 7254, 7255, 7256, 7257, 7258, 7259, 7260, 7261, 7262, 7263, 7264, 7265, 7266, 7267, 7268, 7269, 7270, 7271, 7272, 7273, 7274, 7275, 7276, 7277, 7278, 7279, 7280, 7281, 7282, 7283, 7284, 7285, 7286, 7287, 7288, 7289, 7290, 7291, 7292, 7293, 7294, 7295, 7296, 7297, 7298, 7299, 7300, 7301, 7302, 7303, 7304, 7305, 7306, 7307, 7308, 7309, 7310, 7311, 7312, 7313, 7314, 7315, 7316, 7317, 7318, 7319, 7320, 7321, 7322, 7323, 7324, 7325, 7326, 7327, 7328, 7329, 7330, 7331, 7332, 7333, 7334, 7335, 7336, 7337, 7338, 7339, 7340, 7341, 7342, 7343, 7344, 7345, 7346, 7347, 7348, 7349, 7350, 7351, 7352, 7353, 7354, 7355, 7356, 7357, 7358, 7359, 7360, 7361, 7362, 7363, 7364, 7365, 7366, 7367, 7368, 7369, 7370, 7371, 7372, 7373, 7374, 7375, 7376, 7377, 7378, 7379, 7380, 7381, 7382, 7383, 7384, 7385, 7386, 7387, 7388, 7389, 7390, 7391, 7392, 7393, 7394, 7395, 7396, 7397, 7398, 7399, 7400, 7401, 7402, 7403, 7404, 7405, 7406, 7407, 7408, 7409, 7410, 7411, 7412, 7413, 7414, 7415, 7416, 7417, 7418, 7419, 7420, 7421, 7422, 7423, 7424, 7425, 7426, 7427, 7428, 7429, 7430, 7431, 7432, 7433, 7434, 7435, 7436, 7437, 7438, 7439, 7440, 7441, 7442, 7443, 7444, 7445, 7446, 7447, 7448, 7449, 7450, 7451, 7452, 7453, 7454, 7455, 7456, 7457, 7458, 7459, 7460, 7461, 7462, 7463, 7464, 7465, 7466, 7467, 7468, 7469, 7470, 7471, 7472, 7473, 7474, 7475, 7476, 7477, 7478, 7479, 7480, 7481, 7482, 7483, 7484, 7485, 7486, 7487, 7488, 7489, 7490, 7491, 7492, 7493, 7494, 7495, 7496, 7497, 7498, 7499, 7500, 7501, 7502, 7503, 7504, 7505, 7506, 7507, 7508, 7509, 7510, 7511, 7512, 7513, 7514, 7515, 7516, 7517, 7518, 7519, 7520, 7521, 7522, 7523, 7524, 7525, 7526, 7527, 7528, 7529, 7530, 7531, 7532, 7533, 7534, 7535, 7536, 7537, 7538, 7539, 7540, 7541, 7542, 7543, 7544, 7545, 7546, 7547, 7548, 7549, 7550, 7551, 7552, 7553, 7554, 7555, 7556, 7557, 7558, 7559, 7560, 7561, 7562, 7563, 7564, 7565, 7566, 7567, 7568, 7569, 7570, 7571, 7572, 7573, 7574, 7575, 7576, 7577, 7578, 7579, 7580, 7581, 7582, 7583, 7584, 7585, 7586, 7587, 7588, 7589, 7590, 7591, 7592, 7593, 7594, 7595, 7596, 7597, 7598, 7599, 7600, 7601, 7602, 7603, 7604, 7605, 7606, 7607, 7608, 7609, 7610, 7611, 7612, 7613, 7614, 7615, 7616, 7617, 7618, 7619, 7620, 7621, 7622, 7623, 7624, 7625, 7626, 7627, 7628, 7629, 7630, 7631, 7632, 7633, 7634, 7635, 7636, 7637, 7638, 7639, 7640, 7641, 7642, 7643, 7644, 7645, 7646, 7647, 7648, 7649, 7650, 7651, 7652, 7653, 7654, 7655, 7656, 7657, 7658, 7659, 7660, 7661, 7662, 7663, 7664, 7665, 7666, 7667, 7668, 7669, 7670, 7671, 7672, 7673, 7674, 7675, 7676, 7677, 7678, 7679, 7680, 7681, 7682, 7683, 7684, 7685, 7686, 7687, 7688, 7689, 7690, 7691, 7692, 7693, 7694, 7695, 7696, 7697, 7698, 7699, 7700, 7701, 7702, 7703, 7704, 7705, 7706, 7707, 7708, 7709, 7710, 7711, 7712, 7713, 7714, 7715, 7716, 7717, 7718, 7719, 7720, 7721, 7722, 7723, 7724, 7725, 7726, 7727, 7728, 7729, 7730, 7731, 7732, 7733, 7734, 7735, 7736, 7737, 7738, 7739, 7740, 7741, 7742, 7743, 7744, 7745, 7746, 7747, 7748, 7749, 7750, 7751, 7752, 7753, 7754, 7755, 7756, 7757, 7758, 7759, 7760, 7761, 7762, 7763, 7764, 7765, 7766, 7767, 7768, 7769, 7770, 7771, 7772, 7773, 7774, 7775, 7776, 7777, 7778, 7779, 7780, 7781, 7782, 7783, 7784, 7785, 7786, 7787, 7788, 7789, 7790, 7791, 7792, 7793, 7794, 7795, 7796, 7797, 7798, 7799, 7800, 7801, 7802, 7803, 7804, 7805, 7806, 7807, 7808, 7809, 7810, 7811, 7812, 7813, 7814, 7815, 7816, 7817, 7818, 7819, 7820, 7821, 7822, 7823, 7824, 7825, 7826, 7827, 7828, 7829, 7830, 7831, 7832, 7833, 7834, 7835, 7836, 7837, 7838, 7839, 7840, 7841, 7842, 7843, 7844, 7845, 7846, 7847, 7848, 7849, 7850, 7851, 7852, 7853, 7854, 7855, 7856, 7857, 7858, 7859, 7860, 7861, 7862, 7863, 7864, 7865, 7866, 7867, 7868, 7869, 7870, 7871, 7872, 7873, 7874, 7875, 7876, 7877, 7878, 7879, 7880, 7881, 7882, 7883, 7884, 7885, 7886, 7887, 7888, 7889, 7890, 7891, 7892, 7893, 7894, 7895, 7896, 7897, 7898, 7899, 7900, 7901, 7902, 7903, 7904, 7905, 7906, 7907, 7908, 7909, 7910, 7911, 7912, 7913, 7914, 7915, 7916, 7917, 7918, 7919, 7920, 7921, 7922, 7923, 7924, 7925, 7926, 7927, 7928, 7929, 7930, 7931, 7932, 7933, 7934, 7935, 7936, 7937, 7938, 7939, 7940, 7941, 7942, 7943, 7944, 7945, 7946, 7947, 7948, 7949, 7950, 7951, 7952, 7953, 7954, 7955, 7956, 7957, 7958, 7959, 7960, 7961, 7962, 7963, 7964, 7965, 7966, 7967, 7968, 7969, 7970, 7971, 7972, 7973, 7974, 7975, 7976, 7977, 7978, 7979, 7980, 7981, 7982, 7983, 7984, 7985, 7986, 7987, 7988, 7989, 7990, 7991, 7992, 7993, 7994, 7995, 7996, 7997, 7998, 7999, 8000, 8001, 8002, 8003, 8004, 8005, 8006, 8007, 8008, 8009, 8010, 8011, 8012, 8013, 8014, 8015, 8016, 8017, 8018, 8019, 8020, 8021, 8022, 8023, 8024, 8025, 8026, 8027, 8028, 8029, 8030, 8031, 8032, 8033, 8034, 8035, 8036, 8037, 8038, 8039, 8040, 8041, 8042, 8043, 8044, 8045, 8046, 8047, 8048, 8049, 8050, 8051, 8052, 8053, 8054, 8055, 8056, 8057, 8058, 8059, 8060, 8061, 8062, 8063, 8064, 8065, 8066, 8067, 8068, 8069, 8070, 8071, 8072, 8073, 8074, 8075, 8076, 8077, 8078, 8079, 8080, 8081, 8082, 8083, 8084, 8085, 8086, 8087, 8088, 8089, 8090, 8091, 8092, 8093, 8094, 8095, 8096, 8097, 8098, 8099, 8100, 8101, 8102, 8103, 8104, 8105, 8106, 8107, 8108, 8109, 8110, 8111, 8112, 8113, 8114, 8115, 8116, 8117, 8118, 8119, 8120, 8121, 8122, 8123, 8124, 8125, 8126, 8127, 8128, 8129, 8130, 8131, 8132, 8133, 8134, 8135, 8136, 8137, 8138, 8139, 8140, 8141, 8142, 8143, 8144, 8145, 8146, 8147, 8148, 8149, 8150, 8151, 8152, 8153, 8154, 8155, 8156, 8157, 8158, 8159, 8160, 8161, 8162, 8163, 8164, 8165, 8166, 8167, 8168, 8169, 8170, 8171, 8172, 8173, 8174, 8175, 8176, 8177, 8178, 8179, 8180, 8181, 8182, 8183, 8184, 8185, 8186, 8187, 8188, 8189, 8190, 8191, 8192, 8193, 8194, 8195, 8196, 8197, 8198, 8199, 8200, 8201, 8202, 8203, 8204, 8205, 8206, 8207, 8208, 8209, 8210, 8211, 8212, 8213, 8214, 8215, 8216, 8217, 8218, 8219, 8220, 8221, 8222, 8223, 8224, 8225, 8226, 8227, 8228, 8229, 8230, 8231, 8232, 8233, 8234, 8235, 8236, 8237, 8238, 8239, 8240, 8241, 8242, 8243, 8244, 8245, 8246, 8247, 8248, 8249, 8250, 8251, 8252, 8253, 8254, 8255, 8256, 8257, 8258, 8259, 8260, 8261, 8262, 8263, 8264, 8265, 8266, 8267, 8268, 8269, 8270, 8271, 8272, 8273, 8274, 8275, 8276, 8277, 8278, 8279, 8280, 8281, 8282, 8283, 8284, 8285, 8286, 8287, 8288, 8289, 8290, 8291, 8292, 8293, 8294, 8295, 8296, 8297, 8298, 8299, 8300, 8301, 8302, 8303, 8304, 8305, 8306, 8307, 8308, 8309, 8310, 8311, 8312, 8313, 8314, 8315, 8316, 8317, 8318, 8319, 8320, 8321, 8322, 8323, 8324, 8325, 8326, 8327, 8328, 8329, 8330, 8331, 8332, 8333, 8334, 8335, 8336, 8337, 8338, 8339, 8340, 8341, 8342, 8343, 8344, 8345, 8346, 8347, 8348, 8349, 8350, 8351, 8352, 8353, 8354, 8355, 8356, 8357, 8358, 8359, 8360, 8361, 8362, 8363, 8364, 8365, 8366, 8367, 8368, 8369, 8370, 8371, 8372, 8373, 8374, 8375, 8376, 8377, 8378, 8379, 8380, 8381, 8382, 8383, 8384, 8385, 8386, 8387, 8388, 8389, 8390, 8391, 8392, 8393, 8394, 8395, 8396, 8397, 8398, 8399, 8400, 8401, 8402, 8403, 8404, 8405, 8406, 8407, 8408, 8409, 8410, 8411, 8412, 8413, 8414, 8415, 8416, 8417, 8418, 8419, 8420, 8421, 8422, 8423, 8424, 8425, 8426, 8427, 8428, 8429, 8430, 8431, 8432, 8433, 8434, 8435, 8436, 8437, 8438, 8439, 8440, 8441, 8442, 8443, 8444, 8445, 8446, 8447, 8448, 8449, 8450, 8451, 8452, 8453, 8454, 8455, 8456, 8457, 8458, 8459, 8460, 8461, 8462, 8463, 8464, 8465, 8466, 8467, 8468, 8469, 8470, 8471, 8472, 8473, 8474, 8475, 8476, 8477, 8478, 8479, 8480, 8481, 8482, 8483, 8484, 8485, 8486, 8487, 8488, 8489, 8490, 8491, 8492, 8493, 8494, 8495, 8496, 8497, 8498, 8499, 8500, 8501, 8502, 8503, 8504, 8505, 8506, 8507, 8508, 8509, 8510, 8511, 8512, 8513, 8514, 8515, 8516, 8517, 8518, 8519, 8520, 8521, 8522, 8523, 8524, 8525, 8526, 8527, 8528, 8529, 8530, 8531, 8532, 8533, 8534, 8535, 8536, 8537, 8538, 8539, 8540, 8541, 8542, 8543, 8544, 8545, 8546, 8547, 8548, 8549, 8550, 8551, 8552, 8553, 8554, 8555, 8556, 8557, 8558, 8559, 8560, 8561, 8562, 8563, 8564, 8565, 8566, 8567, 8568, 8569, 8570, 8571, 8572, 8573, 8574, 8575, 8576, 8577, 8578, 8579, 8580, 8581, 8582, 8583, 8584, 8585, 8586, 8587, 8588, 8589, 8590, 8591, 8592, 8593, 8594, 8595, 8596, 8597, 8598, 8599, 8600, 8601, 8602, 8603, 8604, 8605, 8606, 8607, 8608, 8609, 8610, 8611, 8612, 8613, 8614, 8615, 8616, 8617, 8618, 8619, 8620, 8621, 8622, 8623, 8624, 8625, 8626, 8627, 8628, 8629, 8630, 8631, 8632, 8633, 8634, 8635, 8636, 8637, 8638, 8639, 8640, 8641, 8642, 8643, 8644, 8645, 8646, 8647, 8648, 8649, 8650, 8651, 8652, 8653, 8654, 8655, 8656, 8657, 8658, 8659, 8660, 8661, 8662, 8663, 8664, 8665, 8666, 8667, 8668, 8669, 8670, 8671, 8672, 8673, 8674, 8675, 8676, 8677, 8678, 8679, 8680, 8681, 8682, 8683, 8684, 8685, 8686, 8687, 8688, 8689, 8690, 8691, 8692, 8693, 8694, 8695, 8696, 8697, 8698, 8699, 8700, 8701, 8702, 8703, 8704, 8705, 8706, 8707, 8708, 8709, 8710, 8711, 8712, 8713, 8714, 8715, 8716, 8717, 8718, 8719, 8720, 8721, 8722, 8723, 8724, 8725, 8726, 8727, 8728, 8729, 8730, 8731, 8732, 8733, 8734, 8735, 8736, 8737, 8738, 8739, 8740, 8741, 8742, 8743, 8744, 8745, 8746, 8747, 8748, 8749, 8750, 8751, 8752, 8753, 8754, 8755, 8756, 8757, 8758, 8759, 8760, 8761, 8762, 8763, 8764, 8765, 8766, 8767, 8768, 8769, 8770, 8771, 8772, 8773, 8774, 8775, 8776, 8777, 8778, 8779, 8780, 8781, 8782, 8783, 8784, 8785, 8786, 8787, 8788, 8789, 8790, 8791, 8792, 8793, 8794, 8795, 8796, 8797, 8798, 8799, 8800, 8801, 8802, 8803, 8804, 8805, 8806, 8807, 8808, 8809, 8810, 8811, 8812, 8813, 8814, 8815, 8816, 8817, 8818, 8819, 8820, 8821, 8822, 8823, 8824, 8825, 8826, 8827, 8828, 8829, 8830, 8831, 8832, 8833, 8834, 8835, 8836, 8837, 8838, 8839, 8840, 8841, 8842, 8843, 8844, 8845, 8846, 8847, 8848, 8849, 8850, 8851, 8852, 8853, 8854, 8855, 8856, 8857, 8858, 8859, 8860, 8861, 8862, 8863, 8864, 8865, 8866, 8867, 8868, 8869, 8870, 8871, 8872, 8873, 8874, 8875, 8876, 8877, 8878, 8879, 8880, 8881, 8882, 8883, 8884, 8885, 8886, 8887, 8888, 8889, 8890, 8891, 8892, 8893, 8894, 8895, 8896, 8897, 8898, 8899, 8900, 8901, 8902, 8903, 8904, 8905, 8906, 8907, 8908, 8909, 8910, 8911, 8912, 8913, 8914, 8915, 8916, 8917, 8918, 8919, 8920, 8921, 8922, 8923, 8924, 8925, 8926, 8927, 8928, 8929, 8930, 8931, 8932, 8933, 8934, 8935, 8936, 8937, 8938, 8939, 8940, 8941, 8942, 8943, 8944, 8945, 8946, 8947, 8948, 8949, 8950, 8951, 8952, 8953, 8954, 8955, 8956, 8957, 8958, 8959, 8960, 8961, 8962, 8963, 8964, 8965, 8966, 8967, 8968, 8969, 8970, 8971, 8972, 8973, 8974, 8975, 8976, 8977, 8978, 8979, 8980, 8981, 8982, 8983, 8984, 8985, 8986, 8987, 8988, 8989, 8990, 8991, 8992, 8993, 8994, 8995, 8996, 8997, 8998, 8999, 9000, 9001, 9002, 9003, 9004, 9005, 9006, 9007, 9008, 9009, 9010, 9011, 9012, 9013, 9014, 9015, 9016, 9017, 9018, 9019, 9020, 9021, 9022, 9023, 9024, 9025, 9026, 9027, 9028, 9029, 9030, 9031, 9032, 9033, 9034, 9035, 9036, 9037, 9038, 9039, 9040, 9041, 9042, 9043, 9044, 9045, 9046, 9047, 9048, 9049, 9050, 9051, 9052, 9053, 9054, 9055, 9056, 9057, 9058, 9059, 9060, 9061, 9062, 9063, 9064, 9065, 9066, 9067, 9068, 9069, 9070, 9071, 9072, 9073, 9074, 9075, 9076, 9077, 9078, 9079, 9080, 9081, 9082, 9083, 9084, 9085, 9086, 9087, 9088, 9089, 9090, 9091, 9092, 9093, 9094, 9095, 9096, 9097, 9098, 9099, 9100, 9101, 9102, 9103, 9104, 9105, 9106, 9107, 9108, 9109, 9110, 9111, 9112, 9113, 9114, 9115, 9116, 9117, 9118, 9119, 9120, 9121, 9122, 9123, 9124, 9125, 9126, 9127, 9128, 9129, 9130, 9131, 9132, 9133, 9134, 9135, 9136, 9137, 9138, 9139, 9140, 9141, 9142, 9143, 9144, 9145, 9146, 9147, 9148, 9149, 9150, 9151, 9152, 9153, 9154, 9155, 9156, 9157, 9158, 9159, 9160, 9161, 9162, 9163, 9164, 9165, 9166, 9167, 9168, 9169, 9170, 9171, 9172, 9173, 9174, 9175, 9176, 9177, 9178, 9179, 9180, 9181, 9182, 9183, 9184, 9185, 9186, 9187, 9188, 9189, 9190, 9191, 9192, 9193, 9194, 9195, 9196, 9197, 9198, 9199, 9200, 9201, 9202, 9203, 9204, 9205, 9206, 9207, 9208, 9209, 9210, 9211, 9212, 9213, 9214, 9215, 9216, 9217, 9218, 9219, 9220, 9221, 9222, 9223, 9224, 9225, 9226, 9227, 9228, 9229, 9230, 9231, 9232, 9233, 9234, 9235, 9236, 9237, 9238, 9239, 9240, 9241, 9242, 9243, 9244, 9245, 9246, 9247, 9248, 9249, 9250, 9251, 9252, 9253, 9254, 9255, 9256, 9257, 9258, 9259, 9260, 9261, 9262, 9263, 9264, 9265, 9266, 9267, 9268, 9269, 9270, 9271, 9272, 9273, 9274, 9275, 9276, 9277, 9278, 9279, 9280, 9281, 9282, 9283, 9284, 9285, 9286, 9287, 9288, 9289, 9290, 9291, 9292, 9293, 9294, 9295, 9296, 9297, 9298, 9299, 9300, 9301, 9302, 9303, 9304, 9305, 9306, 9307, 9308, 9309, 9310, 9311, 9312, 9313, 9314, 9315, 9316, 9317, 9318, 9319, 9320, 9321, 9322, 9323, 9324, 9325, 9326, 9327, 9328, 9329, 9330, 9331, 9332, 9333, 9334, 9335, 9336, 9337, 9338, 9339, 9340, 9341, 9342, 9343, 9344, 9345, 9346, 9347, 9348, 9349, 9350, 9351, 9352, 9353, 9354, 9355, 9356, 9357, 9358, 9359, 9360, 9361, 9362, 9363, 9364, 9365, 9366, 9367, 9368, 9369, 9370, 9371, 9372, 9373, 9374, 9375, 9376, 9377, 9378, 9379, 9380, 9381, 9382, 9383, 9384, 9385, 9386, 9387, 9388, 9389, 9390, 9391, 9392, 9393, 9394, 9395, 9396, 9397, 9398, 9399, 9400, 9401, 9402, 9403, 9404, 9405, 9406, 9407, 9408, 9409, 9410, 9411, 9412, 9413, 9414, 9415, 9416, 9417, 9418, 9419, 9420, 9421, 9422, 9423, 9424, 9425, 9426, 9427, 9428, 9429, 9430, 9431, 9432, 9433, 9434, 9435, 9436, 9437, 9438, 9439, 9440, 9441, 9442, 9443, 9444, 9445, 9446, 9447, 9448, 9449, 9450, 9451, 9452, 9453, 9454, 9455, 9456, 9457, 9458, 9459, 9460, 9461, 9462, 9463, 9464, 9465, 9466, 9467, 9468, 9469, 9470, 9471, 9472, 9473, 9474, 9475, 9476, 9477, 9478, 9479, 9480, 9481, 9482, 9483, 9484, 9485, 9486, 9487, 9488, 9489, 9490, 9491, 9492, 9493, 9494, 9495, 9496, 9497, 9498, 9499, 9500, 9501, 9502, 9503, 9504, 9505, 9506, 9507, 9508, 9509, 9510, 9511, 9512, 9513, 9514, 9515, 9516, 9517, 9518, 9519, 9520, 9521, 9522, 9523, 9524, 9525, 9526, 9527, 9528, 9529, 9530, 9531, 9532, 9533, 9534, 9535, 9536, 9537, 9538, 9539, 9540, 9541, 9542, 9543, 9544, 9545, 9546, 9547, 9548, 9549, 9550, 9551, 9552, 9553, 9554, 9555, 9556, 9557, 9558, 9559, 9560, 9561, 9562, 9563, 9564, 9565, 9566, 9567, 9568, 9569, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, 9578, 9579, 9580, 9581, 9582, 9583, 9584, 9585, 9586, 9587, 9588, 9589, 9590, 9591, 9592, 9593, 9594, 9595, 9596, 9597, 9598, 9599, 9600, 9601, 9602, 9603, 9604, 9605, 9606, 9607, 9608, 9609, 9610, 9611, 9612, 9613, 9614, 9615, 9616, 9617, 9618, 9619, 9620, 9621, 9622, 9623, 9624, 9625, 9626, 9627, 9628, 9629, 9630, 9631, 9632, 9633, 9634, 9635, 9636, 9637, 9638, 9639, 9640, 9641, 9642, 9643, 9644, 9645, 9646, 9647, 9648, 9649, 9650, 9651, 9652, 9653, 9654, 9655, 9656, 9657, 9658, 9659, 9660, 9661, 9662, 9663, 9664, 9665, 9666, 9667, 9668, 9669, 9670, 9671, 9672, 9673, 9674, 9675, 9676, 9677, 9678, 9679, 9680, 9681, 9682, 9683, 9684, 9685, 9686, 9687, 9688, 9689, 9690, 9691, 9692, 9693, 9694, 9695, 9696, 9697, 9698, 9699, 9700, 9701, 9702, 9703, 9704, 9705, 9706, 9707, 9708, 9709, 9710, 9711, 9712, 9713, 9714, 9715, 9716, 9717, 9718, 9719, 9720, 9721, 9722, 9723, 9724, 9725, 9726, 9727, 9728, 9729, 9730, 9731, 9732, 9733, 9734, 9735, 9736, 9737, 9738, 9739, 9740, 9741, 9742, 9743, 9744, 9745, 9746, 9747, 9748, 9749, 9750, 9751, 9752, 9753, 9754, 9755, 9756, 9757, 9758, 9759, 9760, 9761, 9762, 9763, 9764, 9765, 9766, 9767, 9768, 9769, 9770, 9771, 9772, 9773, 9774, 9775, 9776, 9777, 9778, 9779, 9780, 9781, 9782, 9783, 9784, 9785, 9786, 9787, 9788, 9789, 9790, 9791, 9792, 9793, 9794, 9795, 9796, 9797, 9798, 9799, 9800, 9801, 9802, 9803, 9804, 9805, 9806, 9807, 9808, 9809, 9810, 9811, 9812, 9813, 9814, 9815, 9816, 9817, 9818, 9819, 9820, 9821, 9822, 9823, 9824, 9825, 9826, 9827, 9828, 9829, 9830, 9831, 9832, 9833, 9834, 9835, 9836, 9837, 9838, 9839, 9840, 9841, 9842, 9843, 9844, 9845, 9846, 9847, 9848, 9849, 9850, 9851, 9852, 9853, 9854, 9855, 9856, 9857, 9858, 9859, 9860, 9861, 9862, 9863, 9864, 9865, 9866, 9867, 9868, 9869, 9870, 9871, 9872, 9873, 9874, 9875, 9876, 9877, 9878, 9879, 9880, 9881, 9882, 9883, 9884, 9885, 9886, 9887, 9888, 9889, 9890, 9891, 9892, 9893, 9894, 9895, 9896, 9897, 9898, 9899, 9900, 9901, 9902, 9903, 9904, 9905, 9906, 9907, 9908, 9909, 9910, 9911, 9912, 9913, 9914, 9915, 9916, 9917, 9918, 9919, 9920, 9921, 9922, 9923, 9924, 9925, 9926, 9927, 9928, 9929, 9930, 9931, 9932, 9933, 9934, 9935, 9936, 9937, 9938, 9939, 9940, 9941, 9942, 9943, 9944, 9945, 9946, 9947, 9948, 9949, 9950, 9951, 9952, 9953, 9954, 9955, 9956, 9957, 9958, 9959, 9960, 9961, 9962, 9963, 9964, 9965, 9966, 9967, 9968, 9969, 9970, 9971, 9972, 9973, 9974, 9975, 9976, 9977, 9978, 9979, 9980, 9981, 9982, 9983, 9984, 9985, 9986, 9987, 9988, 9989, 9990, 9991, 9992, 9993, 9994, 9995, 9996, 9997, 9998, 9999]\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "9Huo15QgR-z2"
+ },
+ "source": [
+ "Now let's take a scenario, where you made the list b and you've been asked to extract the second till the seventh element. Will you go through typing b[1], b[2], b[3] and so on? What if we take list big_numbers and you were required to extract 500 of those entries? Too much of a pain? Well worry not! Python allows for a simpler way to extract these elements"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "CT9IRxuPR-eg",
+ "outputId": "d005a748-89b5-4313-a7bc-38aa9c60f236"
+ },
+ "source": [
+ "print( b[1:7] ) # Yes that's right, you can slice these elements in this manner. [start_index : end_index + 1]"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "[1, 2, 3, 4, 5, 6]\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "Dakul-ljSRCG"
+ },
+ "source": [
+ "Did you know that python allows you to extract negative indices too? You might be thinking about how that works right? Well whenever we provide python a negative index we essentially ask it to start at the end of the list and go backwards while indexing"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "Dw_WQShg5mn6",
+ "outputId": "13433724-56e2-4251-8bcb-8e18b00155cc"
+ },
+ "source": [
+ "# You can also extract all the elements till the end in the following way\n",
+ "print( b[4:] )"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "[4, 5, 6, 7, 8, 9]\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "y1yR_49iSRfD",
+ "outputId": "05eb1ea7-b55a-4d16-cf3e-e12cb2d3adb5"
+ },
+ "source": [
+ "print( b[-3] ) # SPOILER ALERT: It will print the last element!"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "7\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "lV3i9fF16PFT",
+ "outputId": "05eda5f8-4b89-4c81-fdbf-29bea876acce"
+ },
+ "source": [
+ "print( b[-4:-2] )"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "[6, 7]\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "PKtd8bHaSatf"
+ },
+ "source": [
+ "Now what do we do if we want to increment all the elements of b by 2 and store it in a new list c? You'll most probably think of something like this"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "iAKjIG0zSaWD",
+ "outputId": "cbee0b77-dcda-440f-b6d0-d8c2ba1c6505"
+ },
+ "source": [
+ "c = []\n",
+ "\n",
+ "for i in range(len(b)):\n",
+ " c.append(2 + b[i])\n",
+ "print(c)"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "[2, 3, 4, 5, 6, 7, 8, 9, 10, 11]\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "TFrChrGcSgiC"
+ },
+ "source": [
+ "While in theory this is essentially what is happening, there is another way which is much smaller which python allows for. It's called List Comperehension. Look at the following example"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "8lD4a7xDSg-r",
+ "outputId": "7b70cf4d-4a5f-4809-8424-8ebbd2eebfc5"
+ },
+ "source": [
+ "c = [x+2 for x in b]\n",
+ "\n",
+ "print(c)"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "[2, 3, 4, 5, 6, 7, 8, 9, 10, 11]\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "m9TfOT-pSmnJ"
+ },
+ "source": [
+ "As you can see we've got the same results!!\n",
+ "\n",
+ "Let's try out an example"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "Jd94V4PVSm_G",
+ "outputId": "24e53935-089c-48d3-c63a-31ad5291f0ef"
+ },
+ "source": [
+ "# Let us make a new list d whose entries are those entries in c which are greater than 6\n",
+ "d = [x for x in c if x>6]\n",
+ "d"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "[7, 8, 9, 10, 11]"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 22
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "2c-eDhwRSsZK"
+ },
+ "source": [
+ "Well what do we do if we want to change the 3rd element of the list c to the number 42?"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "Qx6QvwmBSuVL",
+ "outputId": "ec11d16f-473e-488e-8846-03e12267395b"
+ },
+ "source": [
+ "# We simply do\n",
+ "c[2] = 42\n",
+ "\n",
+ "print(c)"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "[2, 3, 42, 5, 6, 7, 8, 9, 10, 11]\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "nmTg0SUUSx1B"
+ },
+ "source": [
+ "As you can see the third element of the list has changed\n",
+ "\n",
+ "Let us try removing one element from somewhere in between. Let's remove 7 from the list c"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "47vaL_GgSyNf",
+ "outputId": "171de76d-8158-4aaf-d2e6-183257f3ad31"
+ },
+ "source": [
+ "c.remove(7)\n",
+ "\n",
+ "print(c)"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "[2, 3, 42, 5, 6, 8, 9, 10, 11]\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "PwfQKc0wS7Su"
+ },
+ "source": [
+ "## Tuples\n",
+ "A tuple is a collection of entries which are ordered in the same way as lists but cannot be changed.\n",
+ "\n",
+ "All the regular list operations apply to tuples except for those which attempt to change it's own value"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "Pq3NlFaeS707",
+ "outputId": "fa6c4a5b-2155-4a56-bedb-a1fbd3c11350"
+ },
+ "source": [
+ "# Let us define a tuple\n",
+ "\n",
+ "tup_a = (1,2,3,4,5,6)\n",
+ "\n",
+ "print(tup_a)"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "(1, 2, 3, 4, 5, 6)\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "Nr-55sUvS-V9"
+ },
+ "source": [
+ "Let us try changing the entry of a tuple and see what happens"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 164
+ },
+ "id": "tkBPk7YZTDdX",
+ "outputId": "0c07c578-ce14-4a21-c41b-a2c64cfde481"
+ },
+ "source": [
+ "tup_a[2] = 42"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "error",
+ "ename": "TypeError",
+ "evalue": "ignored",
+ "traceback": [
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
+ "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mtup_a\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m42\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+ "\u001b[0;31mTypeError\u001b[0m: 'tuple' object does not support item assignment"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "5XkSzECaTIdh"
+ },
+ "source": [
+ "Oh no, it errored out :(\n",
+ " \n",
+ "But this was expected right?"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "S2OX8z4yTI2S",
+ "outputId": "e886a512-9f08-4522-bbb9-a4b834a11324"
+ },
+ "source": [
+ "# Make a new list e which has double the values of tuple a and select the 3rd till 5th element (both inclusive) of both list b and tuple tup_a to compare\n",
+ "\n",
+ "e = [2*x for x in tup_a]\n",
+ "\n",
+ "print(e[2:5])\n",
+ "print(tup_a[2:5])"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "[6, 8, 10]\n",
+ "(3, 4, 5)\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "4K_M7yPdrnrL"
+ },
+ "source": [
+ "## Sets\n",
+ "A collection of items that is both unordered and unindexed and doesn't allow duplicate values is called a set. Its main usage is to store multiple items in a single variable.\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "xTUCNWINsMWx",
+ "outputId": "0a8a6cfa-7c35-4817-efd8-e9536af963a7"
+ },
+ "source": [
+ "thisset = {\"apple\", \"banana\", \"cherry\"}\n",
+ "print(thisset) \n",
+ "\n",
+ "#Another way to define it\n",
+ "thisset = set([\"apple\", \"banana\", \"cherry\"])\n",
+ "print(thisset)"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "{'cherry', 'apple', 'banana'}\n",
+ "{'cherry', 'apple', 'banana'}\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "ifOGk8mVse6x"
+ },
+ "source": [
+ "Well now that we know how to define a set let's go ahead and see some set operations"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "TX9ZyfoKsnvV",
+ "outputId": "7309838b-4fad-4289-d287-35424d411dd7"
+ },
+ "source": [
+ "one=set([4,5,6,7,1,2,3]) \n",
+ "two=set([4,5,3,2,1,2]) \n",
+ " \n",
+ "print(\"The sets: \", one, two)\n",
+ "print (\"Intersection: \",one & two) \n",
+ "print (\"Union: \",one | two) \n",
+ "print(\"Difference: \",one - two)"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "The sets: {1, 2, 3, 4, 5, 6, 7} {1, 2, 3, 4, 5}\n",
+ "Intersection: {1, 2, 3, 4, 5}\n",
+ "Union: {1, 2, 3, 4, 5, 6, 7}\n",
+ "Difference: {6, 7}\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "m0UoxWLguXuI"
+ },
+ "source": [
+ "As you can see with set two, the value which was repeated has got deleted while creating the set"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "usMVleHaTXTv"
+ },
+ "source": [
+ "# Dictionaries\n",
+ "\n",
+ "A dictionary is a collection of key value pairs which is ordered, changable and does not allow duplicate members. \n",
+ "\n",
+ "Too much terminology which doesn't make sense?\n",
+ "\n",
+ "Don't worry about it! Let's consider an analogy. \n",
+ "\n",
+ "What do you do when you save your close friend Manish's phone number on your phone? You type in their name followed by their phone number so that when they call you, you don't just see 10 digits staring at your face but instead see your friend's name. Well while saving that friend's number you have essentially created a dictionary!!!!\n",
+ "\n",
+ "You have used the friend's name as the key and his/her phone number as the value in the key value pair of the dictionary"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "E8eqQEHtTWnO",
+ "outputId": "9aa39607-e7c7-4e04-a59b-03cfe20be83f"
+ },
+ "source": [
+ "phone_num = {'Manish': 9937593721} # This is just a random number I typed which starts with 9 please don't call this number, I don't even know if it's valid.\n",
+ "\n",
+ "print(phone_num)"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "{'Manish': 9937593721}\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "X7ORBE0BTevt"
+ },
+ "source": [
+ "You go on and meet another friend of yours whose name is Harish. He gives you his number so once again you save this number"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "esUUobJ6TeV_",
+ "outputId": "b611f7c6-962d-43ea-ec34-e7a7cafac06c"
+ },
+ "source": [
+ "phone_num['Harish'] = 9203848363 # You can make a new entry by mentioning the key and the value as shown\n",
+ "\n",
+ "print(phone_num)"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "{'Manish': 9937593721, 'Harish': 9203848363}\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "mXydVwQ-T08F"
+ },
+ "source": [
+ "While you were talking to Harish, somewhere in the conversation Harish tells you that very recently he had switched his phone and he lost all his contacts. He asks you to give him Manish's number as they too are good friends. But wait none of us actually remember all our friends numbers do we? :P\n",
+ "\n",
+ "Well the dictionary you created can be used for this purpose!"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "rdWDuXngT1OG",
+ "outputId": "77c79f81-8709-4918-b761-7f0856c53db7"
+ },
+ "source": [
+ "print( phone_num['Manish'] )"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "9937593721\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "2vD73bfBT5jA"
+ },
+ "source": [
+ "While you're talking Harish who is a little absent minded suddenly remembers that he gave you his old phone number by mistake and now wants you to save his new number. Well how do we do that with dictionaries?"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "6ttetOZsT506",
+ "outputId": "e2216c87-6ecf-47b9-b572-90c0326274bc"
+ },
+ "source": [
+ "phone_num['Harish'] = 9694038272 # It's that simple!\n",
+ "\n",
+ "print(phone_num)"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "{'Manish': 9937593721, 'Harish': 9694038272}\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "GeQnecUfT74O"
+ },
+ "source": [
+ "And while he's at it, he asks you to also save his email ID just in case something goes wrong. Well you might be thinking how do we do that? \n",
+ "\n",
+ "Did you know that python also allows us to make a dictionary inside a dictionary?"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "VGpAlqkRT-km",
+ "outputId": "ebfeb4ba-16d8-401f-bbe2-c22a66c060c3"
+ },
+ "source": [
+ "phone_num['Harish'] = {'number': 9694038272, 'email': 'harishsinha2002@abc.com'}\n",
+ "\n",
+ "print(phone_num)"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "{'Manish': 9937593721, 'Harish': {'number': 9694038272, 'email': 'harishsinha2002@abc.com'}}\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "sxW4CJnqUAvb"
+ },
+ "source": [
+ "Well how convenient is that?"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "ACszkje_V95i"
+ },
+ "source": [
+ "# **Python Libraries**\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "AEz0gZBXWAT3"
+ },
+ "source": [
+ "What is a Library?
A collection of modules used for specific applications.
\n",
+ "Popular Libraries in Python\n",
+ "\n",
+ "* NumPy\n",
+ "* Pandas\n",
+ "* OpenCV\n",
+ "* Matplotlib\n",
+ "* Scipy\n",
+ "* Tensorflow\n",
+ "* PyTorch \n",
+ "
and many more...\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "bjTO_7tSWBot"
+ },
+ "source": [
+ "##Importing a Library\n",
+ "We use 'import' to get access to the functions of the library"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "6V8X-PQEWBEH"
+ },
+ "source": [
+ "# importing numpy library with the keyword as np\n",
+ "# Syntax: import as \n",
+ "# Note: as part is optional, but recommended\n",
+ "import numpy as np"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "m6rJ1tqEWI0B"
+ },
+ "source": [
+ "Here, we use a short hand notation for NumPy as 'np' while importing. Trust me, it saves time :)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "S9LxCd_Ciram"
+ },
+ "source": [
+ "# Introduction to NumPy\n",
+ "What is NumPy?
\n",
+ "A python library used to deal with large multidimensional arrays.
\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "z1cVCp6Om8ms",
+ "outputId": "61d21900-2cc9-460a-dc24-bb90bf01d8a6"
+ },
+ "source": [
+ "#Code along with us\n",
+ "x=np.array([9,23,32,47,53])\n",
+ "print(x, type(x))"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "[ 9 23 32 47 53] \n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "PRrqtg4fkpRo"
+ },
+ "source": [
+ "Bro, we already have Lists and Tuples right? Why NumPy?
\n",
+ "Let's compare"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "1nYkT8ADd4pa"
+ },
+ "source": [
+ "N = 100000"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "wTamN8S5lSBk"
+ },
+ "source": [
+ "Let's create a list with N entries containing integers from 0 to N-1 and multiply it element-wise with itself.
%%time will time the operation."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "LNLzAdSrk0am",
+ "outputId": "321d6458-8585-47f2-edba-f467ea4a4e1f"
+ },
+ "source": [
+ "%%time\n",
+ "list_ = list(range(N))\n",
+ "for i in range(N):\n",
+ " list_[i] = list_[i] * list_[i]"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "CPU times: user 28.1 ms, sys: 3.62 ms, total: 31.8 ms\n",
+ "Wall time: 34.6 ms\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "6AHFz9l7mKr7"
+ },
+ "source": [
+ "Now, let's replicate this process using NumPy. Observe the simplicity in syntax and the latency"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "_3jeUsRtmX_L",
+ "outputId": "f78934df-2a82-495d-acbf-c04ad6ef32b5"
+ },
+ "source": [
+ "%%time\n",
+ "arr = np.arange(N)\n",
+ "arr = arr * arr"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "CPU times: user 960 Β΅s, sys: 2.06 ms, total: 3.03 ms\n",
+ "Wall time: 5.78 ms\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "1t2xPoV9Nj9x"
+ },
+ "source": [
+ "## Creating NumPy arrays"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "O1PvcfTJN1qi",
+ "outputId": "7ee61796-6fd4-42de-9f6a-b638888b2919"
+ },
+ "source": [
+ "# Creating an array\n",
+ "arr = np.arange(12)\n",
+ "# Datatype of entries in np array\n",
+ "print(arr.dtype)\n",
+ "# Dimension of np array\n",
+ "print(arr.ndim)\n",
+ "# Shape of array\n",
+ "print(arr.shape)\n",
+ "# Size of array\n",
+ "print(arr.size)"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "int64\n",
+ "1\n",
+ "(12,)\n",
+ "12\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "a9wtsEgEPQtA"
+ },
+ "source": [
+ "Let's create a 2 Dimensional array"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-02-11T16:36:56.997797Z",
+ "start_time": "2021-02-11T16:36:56.987202Z"
+ },
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "lrIZvvGYPc3b",
+ "outputId": "eb31fdb3-93ed-449c-92fa-2dddf97645a9"
+ },
+ "source": [
+ "# Code along with us\n",
+ "arr = np.random.randn(5,4)\n",
+ "arr"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "array([[ 0.2478173 , -0.08314699, -0.68355539, 0.41125926],\n",
+ " [-0.86668575, -0.38280004, 0.15376236, 1.56236058],\n",
+ " [ 0.0080912 , -1.29033337, -0.12327648, 0.29641315],\n",
+ " [ 0.57417218, 0.76962366, 0.91206458, -0.30103345],\n",
+ " [-0.25298833, 1.04734786, 0.51235931, 0.77593098]])"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 47
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "I5UsVrfaoRiS"
+ },
+ "source": [
+ "## Understanding dimension and shape of an array\n",
+ "Try making a 3 Dimensional array. How about a 4 dimensional array? It's getting more complicated?
\n",
+ "No worries, we have NumPy functions to create some basic arrays of required dimensions"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "A7TXVq-JpGjk",
+ "outputId": "426d30e2-3117-4a55-baf6-47169773f5f5"
+ },
+ "source": [
+ "# Create a 2x3x4 array with ones\n",
+ "np.ones((2,3,4))"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "array([[[1., 1., 1., 1.],\n",
+ " [1., 1., 1., 1.],\n",
+ " [1., 1., 1., 1.]],\n",
+ "\n",
+ " [[1., 1., 1., 1.],\n",
+ " [1., 1., 1., 1.],\n",
+ " [1., 1., 1., 1.]]])"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 52
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-02-11T16:37:49.486650Z",
+ "start_time": "2021-02-11T16:37:49.476420Z"
+ },
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "XhzrGuFyped2",
+ "outputId": "140859eb-3775-4b49-a3c0-8614c05fe3c0"
+ },
+ "source": [
+ "# Create a 10x3 array with zeros\n",
+ "arr2 = np.zeros((10,3))\n",
+ "arr2"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "array([[0., 0., 0.],\n",
+ " [0., 0., 0.],\n",
+ " [0., 0., 0.],\n",
+ " [0., 0., 0.],\n",
+ " [0., 0., 0.],\n",
+ " [0., 0., 0.],\n",
+ " [0., 0., 0.],\n",
+ " [0., 0., 0.],\n",
+ " [0., 0., 0.],\n",
+ " [0., 0., 0.]])"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 53
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "bv1h71nhUbre"
+ },
+ "source": [
+ "Let's first define a **function** that gives all info about nature of array"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-02-11T16:37:51.138564Z",
+ "start_time": "2021-02-11T16:37:51.131526Z"
+ },
+ "id": "GeEEzhlrnieZ"
+ },
+ "source": [
+ "# Function code\n",
+ "def array_info(arr):\n",
+ " print(\"dtype is\",arr.dtype)\n",
+ " print(\"shape is\",arr.shape)\n",
+ " print(\"Dimension is\",arr.ndim)\n",
+ " print(\"Size is\",arr.size,\"\\n\") #\\n to separate the text in next function call with a new line char\n"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-02-11T16:37:51.802366Z",
+ "start_time": "2021-02-11T16:37:51.791272Z"
+ },
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "-or8aH6jUmqv",
+ "outputId": "4153f309-022c-439f-ed13-cf822b7e612c"
+ },
+ "source": [
+ "# Calling the function\n",
+ "array_info(arr2)"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "dtype is float64\n",
+ "shape is (10, 3)\n",
+ "Dimension is 2\n",
+ "Size is 30 \n",
+ "\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "sbRoILevSSOz"
+ },
+ "source": [
+ "Observe the difference between the following arrays"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-02-11T16:37:56.508873Z",
+ "start_time": "2021-02-11T16:37:56.494501Z"
+ },
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "KhlJlUbuSQal",
+ "outputId": "13434206-cf0e-4482-efe2-db1607d1bcda"
+ },
+ "source": [
+ "a = np.ones((6))\n",
+ "b = np.ones((6,1))\n",
+ "c = np.ones((2,3))\n",
+ "array_info(a)\n",
+ "array_info(b)\n",
+ "array_info(c)"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "dtype is float64\n",
+ "shape is (6,)\n",
+ "Dimension is 1\n",
+ "Size is 6 \n",
+ "\n",
+ "dtype is float64\n",
+ "shape is (6, 1)\n",
+ "Dimension is 2\n",
+ "Size is 6 \n",
+ "\n",
+ "dtype is float64\n",
+ "shape is (2, 3)\n",
+ "Dimension is 2\n",
+ "Size is 6 \n",
+ "\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "Ar56TPLUtfGk",
+ "outputId": "91ff3050-2463-4785-ce80-b3b6110709d7"
+ },
+ "source": [
+ "print(a)\n",
+ "print(b)\n",
+ "print(c)"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "[1. 1. 1. 1. 1. 1.]\n",
+ "[[1.]\n",
+ " [1.]\n",
+ " [1.]\n",
+ " [1.]\n",
+ " [1.]\n",
+ " [1.]]\n",
+ "[[1. 1. 1.]\n",
+ " [1. 1. 1.]]\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "3WokiWijXZeg"
+ },
+ "source": [
+ "Try creating different sizes of arrays, play around, get the feel"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "p8HoIHXU1BkZ"
+ },
+ "source": [
+ "## Reshaping and Flattening"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-02-11T16:38:13.823498Z",
+ "start_time": "2021-02-11T16:38:13.813820Z"
+ },
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "BiBFZNcL1K3o",
+ "outputId": "9f2da707-5586-4ea8-95ad-b28c13396d38"
+ },
+ "source": [
+ "a.reshape(3,2)"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "array([[1, 2],\n",
+ " [3, 4],\n",
+ " [5, 6]])"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 61
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "G5BenCeo1XqG"
+ },
+ "source": [
+ "Try converting arr2 to a one dimensional array without changing the elements using np.reshape()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-02-11T16:38:39.149648Z",
+ "start_time": "2021-02-11T16:38:39.140397Z"
+ },
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "oNBF6bpV1o0t",
+ "outputId": "330db064-2523-411e-908f-bd664f0e7b40"
+ },
+ "source": [
+ "# Code with us\n",
+ "c.reshape((6,))"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "array([1., 1., 1., 1., 1., 1.])"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 62
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "PZVyl2F31xgp"
+ },
+ "source": [
+ "Use np.ravel to do the same"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-02-11T16:38:44.384069Z",
+ "start_time": "2021-02-11T16:38:44.377572Z"
+ },
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "8v1nIT8t1vpv",
+ "outputId": "dd5b0670-8bb8-4ea5-d88b-249d6fa40586"
+ },
+ "source": [
+ "c.ravel()"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "array([1., 1., 1., 1., 1., 1.])"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 63
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "fCZw29aYqPnU"
+ },
+ "source": [
+ "## Random normal and random uniform in Numpy\n",
+ "Ever heard of normal and uniform distribution?
\n",
+ "* Normal distribution is a probability distribution of a random variable, which has bell shaped curve
\n",
+ "* In uniform distribution, probability of choosing any number at random is equally likely.
\n",
+ "* These probability distributions are extremely useful in a broad spectrum of engineering disciplines. We will look more about this in later part of the session"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "laXxuqsJsl6Y"
+ },
+ "source": [
+ ""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-02-11T16:38:50.456412Z",
+ "start_time": "2021-02-11T16:38:50.452001Z"
+ },
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "m2iymA81rHdI",
+ "outputId": "d8d31687-e96c-4fe1-c71c-85633cde455f"
+ },
+ "source": [
+ "# Creating 2x3 array whose elements are randomly sampled from a normal distribution with mean =0 and std = 1\n",
+ "np.random.randn(2,3)"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "array([[15.61005451, 19.44434949, 20.03029181],\n",
+ " [36.1081871 , 9.12333028, 2.89515486]])"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 66
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-02-11T16:38:51.755201Z",
+ "start_time": "2021-02-11T16:38:51.155719Z"
+ },
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "sjVwk8gzrrKD",
+ "outputId": "98aa152f-835d-4e44-a9f8-dabde8020b4f"
+ },
+ "source": [
+ "# Creating 2x3 array whose elements are randomly sampled from a uniform distribution of [0,1)\n",
+ "np.random.rand(2,3)"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "array([[0.07721078, 0.74332212, 0.14223651],\n",
+ " [0.26645404, 0.7724081 , 0.16799144]])"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 65
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "6Z5QnHGBsJXp"
+ },
+ "source": [
+ "np.random.randint samples only integers, try creating one"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-02-11T16:38:53.825214Z",
+ "start_time": "2021-02-11T16:38:53.818792Z"
+ },
+ "id": "CWXgtAa1sYd6"
+ },
+ "source": [
+ "np.random.randint?"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "qrv-gNc8sobp"
+ },
+ "source": [
+ "## Other Data types in NumPy array"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-02-11T16:39:04.203472Z",
+ "start_time": "2021-02-11T16:39:04.197697Z"
+ },
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "ryrrAqYUtsvI",
+ "outputId": "354a3aad-cf94-448d-847f-ce6ce11feabd"
+ },
+ "source": [
+ "# Create an array with Boolean entries\n",
+ "arr_bool = np.array([True, False, True, True])\n",
+ "print(arr_bool, type(arr_bool))\n"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "[ True False True True] \n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-02-11T16:39:04.821285Z",
+ "start_time": "2021-02-11T16:39:04.815557Z"
+ },
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "2fulEFaUuBZd",
+ "outputId": "5cb6d542-6ef4-41f8-ff58-82de0417162c"
+ },
+ "source": [
+ "# Create an array with str type elements\n",
+ "arr_str = np.array(['1.4','3.14','6.314'])\n",
+ "print(arr_str)"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "['1.4' '3.14' '6.314']\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "0DRn05kmu1yk"
+ },
+ "source": [
+ "Can I use alphabetical characters as elements of NumPy array?"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "Kv0v9dwzvEef"
+ },
+ "source": [
+ "## NumPy Operations"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-02-11T16:39:31.369690Z",
+ "start_time": "2021-02-11T16:39:31.363274Z"
+ },
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "Bj-H7M9-pgX5",
+ "outputId": "e07887b6-842e-40a7-e075-c031b7fa0bfb"
+ },
+ "source": [
+ "arr1 = np.random.randint(0,10,(2,3))\n",
+ "arr2 = np.random.randint(0,10,(2,3))\n",
+ "print(arr1)\n",
+ "print(arr2)"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "[[6 1 9]\n",
+ " [9 5 4]]\n",
+ "[[9 0 9]\n",
+ " [3 7 1]]\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-02-11T16:39:35.429286Z",
+ "start_time": "2021-02-11T16:39:35.418743Z"
+ },
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "LKQNS_sqvdC7",
+ "outputId": "74477d73-d976-47d7-8e27-f3d815e799ea"
+ },
+ "source": [
+ "# Addition\n",
+ "print(arr1+arr2)\n",
+ "# Subtraction\n",
+ "print(arr1-arr2)\n",
+ "# Multiplication\n",
+ "print(arr1*arr2) #Notice that it multiplies element-wise\n",
+ "# Division (Element-wise)\n",
+ "print(arr1/arr2)"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "[[15 1 18]\n",
+ " [12 12 5]]\n",
+ "[[-3 1 0]\n",
+ " [ 6 -2 3]]\n",
+ "[[54 0 81]\n",
+ " [27 35 4]]\n",
+ "[[0.66666667 inf 1. ]\n",
+ " [3. 0.71428571 4. ]]\n"
+ ],
+ "name": "stdout"
+ },
+ {
+ "output_type": "stream",
+ "text": [
+ "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:8: RuntimeWarning: divide by zero encountered in true_divide\n",
+ " \n"
+ ],
+ "name": "stderr"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "dwktvJRRw8kc"
+ },
+ "source": [
+ "Let's look at element-wise division more detailly"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-02-11T16:39:37.498462Z",
+ "start_time": "2021-02-11T16:39:37.491335Z"
+ },
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "M2qZ16pBwRQv",
+ "outputId": "bbda8d70-42a2-42aa-f305-a3652d6a97d6"
+ },
+ "source": [
+ "arr = np.zeros((2,3))\n",
+ "arr_inv = 1/arr"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:2: RuntimeWarning: divide by zero encountered in true_divide\n",
+ " \n"
+ ],
+ "name": "stderr"
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-02-11T16:39:38.205749Z",
+ "start_time": "2021-02-11T16:39:38.197944Z"
+ },
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "5QMehTsPxVNo",
+ "outputId": "fd07b2ff-eedb-495f-a733-1c1d3ae10304"
+ },
+ "source": [
+ "print(arr_inv)"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "[[inf inf inf]\n",
+ " [inf inf inf]]\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "OrKYQyPrxPVl"
+ },
+ "source": [
+ "We did get a **run-time error**"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-02-11T16:39:50.390725Z",
+ "start_time": "2021-02-11T16:39:50.386108Z"
+ },
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "tJiwmraBxgSg",
+ "outputId": "634f706c-d4f4-4590-c8fd-38f0306224b4"
+ },
+ "source": [
+ "np.isinf(arr_inv)"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "array([[ True, True, True],\n",
+ " [ True, True, True]])"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 107
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "FptVB0tf3n9K"
+ },
+ "source": [
+ "In lists, we say that we had to iterate through all the elements to increment each value by some value. NumPy makes our life easy"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-02-11T16:39:51.721092Z",
+ "start_time": "2021-02-11T16:39:51.717266Z"
+ },
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "egYqBkRH33ty",
+ "outputId": "d182e118-19b9-4872-d210-8ac6b31a86a7"
+ },
+ "source": [
+ "print(arr1 + 2)"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "[[ 8 3 11]\n",
+ " [11 7 6]]\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "xBcNna1awn86"
+ },
+ "source": [
+ "Some important mathematical operations. Try running the code below"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-02-11T16:39:53.247867Z",
+ "start_time": "2021-02-11T16:39:53.241595Z"
+ },
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "HOVPBhZJwJ-3",
+ "outputId": "dcd056a7-3ea6-4fce-9fd2-fd20d082b0c7"
+ },
+ "source": [
+ "np.sin(arr1)"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "array([[-0.2794155 , -0.7568025 , 0.98935825],\n",
+ " [ 0.41211849, -0.2794155 , 0.6569866 ]])"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 109
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-02-11T16:39:53.984496Z",
+ "start_time": "2021-02-11T16:39:53.557890Z"
+ },
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "L0zlBVpjwMYF",
+ "outputId": "daff2cf3-dec8-410c-d57e-6b5382553b69"
+ },
+ "source": [
+ "np.exp(arr1)"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "array([[ 403.42879349, 54.59815003, 2980.95798704],\n",
+ " [8103.08392758, 403.42879349, 1096.63315843]])"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 110
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "jtaaw2H2x8SJ"
+ },
+ "source": [
+ "## Statistical operations"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-02-11T16:39:58.066978Z",
+ "start_time": "2021-02-11T16:39:58.061935Z"
+ },
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "X48jkBOCx_kc",
+ "outputId": "9e40aa9b-0d82-4922-f369-b8e192b74935"
+ },
+ "source": [
+ "# Intialise an NumPy array with some vals\n",
+ "arr = np.random.randint(0,50,(3,4))\n",
+ "print(arr)"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "[[10 11 28 6]\n",
+ " [47 30 49 5]\n",
+ " [11 19 4 9]]\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-02-11T16:39:58.378096Z",
+ "start_time": "2021-02-11T16:39:58.369054Z"
+ },
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "XMwtqwi7ygRG",
+ "outputId": "37d76d95-680c-48f0-e773-78606bffb879"
+ },
+ "source": [
+ "np.amin(arr)"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "array([10, 11, 4, 5])"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 86
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-02-11T16:39:58.600656Z",
+ "start_time": "2021-02-11T16:39:58.596779Z"
+ },
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "hCnLaY5jykJx",
+ "outputId": "1b6d9662-d0c0-4867-eddb-797075611cca"
+ },
+ "source": [
+ "np.amax(arr)"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "array([28, 49, 19])"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 87
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-02-11T16:39:58.832823Z",
+ "start_time": "2021-02-11T16:39:58.827851Z"
+ },
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "nHuve64DymZv",
+ "outputId": "bdfd7fd2-3367-48fd-bb61-3d9ebc6bacdc"
+ },
+ "source": [
+ "np.mean(arr)"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "19.083333333333332"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 88
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-02-11T16:39:59.125547Z",
+ "start_time": "2021-02-11T16:39:59.120792Z"
+ },
+ "id": "1v8Uj6o2qIF-"
+ },
+ "source": [
+ "#axis 0 and axis 1"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "DnDHOufryyj6"
+ },
+ "source": [
+ "Browse for NumPy functions to find median, variance, standard deviation and percentile"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "-PQY1pGGeRrg"
+ },
+ "source": [
+ "## Numpy Broadcasting"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "qoWeU8OkeWEI"
+ },
+ "source": [
+ "The term broadcasting describes how numpy treats arrays with different shapes during arithmetic operations. The smaller array is βbroadcastβ across the larger array so that they have compatible shapes. It does this without making needless copies of data and usually leads to efficient algorithm implementations. There are, however, cases where broadcasting is a bad idea because it leads to inefficient use of memory that slows computation."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "mGbMdr9reseF",
+ "outputId": "8834bf4b-fef1-4b58-9560-5a317714ca50"
+ },
+ "source": [
+ "a = np.array([1.0, 2.0, 3.0])\n",
+ "b = np.array([2.0, 2.0, 2.0])\n",
+ "a * b"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "array([2., 4., 6.])"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 117
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "X6CGcAGJfeGM"
+ },
+ "source": [
+ "NumPyβs broadcasting rule relaxes this constraint when the arraysβ shapes meet certain constraints. The simplest broadcasting example occurs when an array and a scalar value are combined in an operation:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "i0OnqvBRe3GR",
+ "outputId": "19a8b68d-88dd-48da-aaa9-c81f933bf7c4"
+ },
+ "source": [
+ "a = np.array([1.0, 2.0, 3.0])\n",
+ "b = 2.0\n",
+ "a * b"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "array([2., 4., 6.])"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 118
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "vcZRFA9Gfqcr"
+ },
+ "source": [
+ "The result is equivalent to the previous example where b was an array. We can think of the scalar b being stretched during the arithmetic operation into an array with the same shape as a. The new elements in b are simply copies of the original scalar. The stretching analogy is only conceptual. NumPy is smart enough to use the original scalar value without actually making copies so that broadcasting operations are as memory and computationally efficient as possible."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "HtsFxlOghhV7"
+ },
+ "source": [
+ "When operating on two arrays, NumPy compares their shapes element-wise. It starts with the trailing (i.e. rightmost) dimensions and works its way left. Two dimensions are compatible when\n",
+ "\n",
+ "1. they are equal, or\n",
+ "2. one of them is 1"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "mzYbrZy-hpvp"
+ },
+ "source": [
+ "Here are some examples: "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "iid6d-iVhlfT"
+ },
+ "source": [
+ "Image (3d array): 256 x 256 x 3\n",
+ "Scale (1d array): 3\n",
+ "Result (3d array): 256 x 256 x 3"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "K8CDNwZih4Mq"
+ },
+ "source": [
+ "A (4d array): 8 x 1 x 6 x 1\n",
+ "B (3d array): 7 x 1 x 5\n",
+ "Result (4d array): 8 x 7 x 6 x 5"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "N6Y92M1pi2mS"
+ },
+ "source": [
+ "A (2d array): 5 x 4\n",
+ "B (1d array): 1\n",
+ "Result (2d array): 5 x 4\n",
+ "\n",
+ "A (2d array): 5 x 4\n",
+ "B (1d array): 4\n",
+ "Result (2d array): 5 x 4\n",
+ "\n",
+ "A (3d array): 15 x 3 x 5\n",
+ "B (3d array): 15 x 1 x 5\n",
+ "Result (3d array): 15 x 3 x 5\n",
+ "\n",
+ "A (3d array): 15 x 3 x 5\n",
+ "B (2d array): 3 x 5\n",
+ "Result (3d array): 15 x 3 x 5\n",
+ "\n",
+ "A (3d array): 15 x 3 x 5\n",
+ "B (2d array): 3 x 1\n",
+ "Result (3d array): 15 x 3 x 5"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "m148KDkji6hF"
+ },
+ "source": [
+ "The below examples represents the case when broadcasting is not possible"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "x1xScvtci5cX"
+ },
+ "source": [
+ "A (1d array): 3\n",
+ "B (1d array): 4 # trailing dimensions do not match\n",
+ "\n",
+ "A (2d array): 2 x 1\n",
+ "B (3d array): 8 x 4 x 3 # second from last dimensions mismatched"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 232
+ },
+ "id": "Z56RUoZNjFYZ",
+ "outputId": "52adca20-8954-4ca6-d56f-09388497c7a9"
+ },
+ "source": [
+ "x = np.arange(4)\n",
+ "xx = x.reshape(4,1)\n",
+ "y = np.ones(5)\n",
+ "z = np.ones((3,4))\n",
+ "\n",
+ "print(x.shape)\n",
+ "print(y.shape)\n",
+ "print(x + y)"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "(4,)\n",
+ "(5,)\n"
+ ],
+ "name": "stdout"
+ },
+ {
+ "output_type": "error",
+ "ename": "ValueError",
+ "evalue": "ignored",
+ "traceback": [
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
+ "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+ "\u001b[0;31mValueError\u001b[0m: operands could not be broadcast together with shapes (4,) (5,) "
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "AfyGBEioOg29",
+ "outputId": "a9f899f3-a068-4674-b362-a9ffdd4220cb"
+ },
+ "source": [
+ "print(xx.shape)\n",
+ "print(y.shape)\n",
+ "print((xx + y).shape)\n",
+ "\n",
+ "print(xx + y)"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "(4, 1)\n",
+ "(5,)\n",
+ "(4, 5)\n",
+ "[[1. 1. 1. 1. 1.]\n",
+ " [2. 2. 2. 2. 2.]\n",
+ " [3. 3. 3. 3. 3.]\n",
+ " [4. 4. 4. 4. 4.]]\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "M-zBRzBLOs34",
+ "outputId": "e99bb69e-46b1-49cd-d20d-f3bafd612728"
+ },
+ "source": [
+ "print(x.shape)\n",
+ "print(z.shape)\n",
+ "print((x + z).shape)\n",
+ "\n",
+ "print(x + z)"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "(4,)\n",
+ "(3, 4)\n",
+ "(3, 4)\n",
+ "[[1. 2. 3. 4.]\n",
+ " [1. 2. 3. 4.]\n",
+ " [1. 2. 3. 4.]]\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "XXzKVFe_oLue"
+ },
+ "source": [
+ "## Exercise Problem 1\n",
+ "Write a program to multiply two matrices of size $(100, 100)$ in two methods: (a) by using `np.dot(mat_1, mat_2)` and (b) by using for-loops. Comapre the time of execution in both the cases. Check out the documentation of `np.dot` in case that is not familiar to you. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "V1M_0booob-E"
+ },
+ "source": [
+ "#Initialise the two matrices\n",
+ "mat_1 = np.random.rand(100,100)\n",
+ "mat_2 = np.random.rand(100,100)\n",
+ "#Intitialise the output matrix with zero\n",
+ "out = np.zeros((100,100))"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "-oLJx7Kro6Nt"
+ },
+ "source": [
+ ""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "aaTJDwk_oRJ8",
+ "outputId": "1db422ba-c4a3-4a4c-bda6-25521c2673f6"
+ },
+ "source": [
+ "## Using the definition of matrix mutliplication\n",
+ "%%time \n",
+ "for i in range(100):\n",
+ " for j in range(100):\n",
+ " sum = 0\n",
+ " for k in range(100):\n",
+ " sum += mat_1[i,k]*mat_2[k,j]\n",
+ " out[i,j] = sum"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "CPU times: user 829 ms, sys: 0 ns, total: 829 ms\n",
+ "Wall time: 843 ms\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "UZr8eW-CoRzO",
+ "outputId": "fa6662d0-b8d0-4c6f-c84a-3abbf4ee8801"
+ },
+ "source": [
+ "## Using np.dot function\n",
+ "%%time\n",
+ "result = np.dot(mat_1, mat_2)\n",
+ "# result = mat_1@mat_2 (an alternative)"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "CPU times: user 148 Β΅s, sys: 2.97 ms, total: 3.12 ms\n",
+ "Wall time: 9.29 ms\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "mAhhefzL2kCv"
+ },
+ "source": [
+ "# Matplotlib\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "PUkcE1IIYcdw"
+ },
+ "source": [
+ "Matplotlib is a popular plotting software. It's name comes from \"MATLAB like Plotting library\"
In this section we will be using a module called pyplot from matlplotlib. A wide range of statistical plots like bar diagrams, pie charts, histograms etc. can be shown using Matplotlib
"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "0KMzbComHKDY"
+ },
+ "source": [
+ "from matplotlib import pyplot as plt"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "5uYr3wCTc8po"
+ },
+ "source": [
+ "## Plotting graphs\n",
+ "Let's make a simple $y$ vs $x$ graph for the function $y(x)$ = $3x$ + 4"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "Fp5v1EH9c6Zm"
+ },
+ "source": [
+ "x = np.linspace(-10,10,100)\n",
+ "y = 3*x + 4"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 282
+ },
+ "id": "-yY-4cq5kzlM",
+ "outputId": "f1731360-cce7-4677-d14f-0002156b2afa"
+ },
+ "source": [
+ "plt.plot(x,y)"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "[]"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 20
+ },
+ {
+ "output_type": "display_data",
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "tags": [],
+ "needs_background": "light"
+ }
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "rr_3-tvdlAys"
+ },
+ "source": [
+ "Let's try plotting any quadratic function, say $y(x)$ = $x^2$"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 282
+ },
+ "id": "KzHxgjpik_P6",
+ "outputId": "8128fc21-f761-4bd7-a658-93a6832b15c9"
+ },
+ "source": [
+ "y = x**2\n",
+ "plt.plot(x, y)"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "[]"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 21
+ },
+ {
+ "output_type": "display_data",
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "tags": [],
+ "needs_background": "light"
+ }
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "bl0shiPzlu0j"
+ },
+ "source": [
+ "Observe that the plot functions plots the best fit inspite of giving only discrete points as inputs."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "07P36169sGdz"
+ },
+ "source": [
+ "Let's consider a noisy data i.e, a data which doesn't have a perfect fit "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "-oizsH_Urdf5",
+ "outputId": "ec64a3dc-ea18-48a5-c7d2-2d704c0bc9e4"
+ },
+ "source": [
+ "# Samples random values from standard normal distribution (Size = 100)\n",
+ "noise = np.random.randn(100)\n",
+ "# Create a lin-spaced array x with 100 elements\n",
+ "x = np.linspace(-10,10,100)\n",
+ "y = 3*x + noise\n",
+ "plt.plot(x,y);"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "image/png": "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\n",
+ "image/svg+xml": "\n\n\n\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "tags": [],
+ "needs_background": "light"
+ }
+ }
+ ]
},
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "lrIZvvGYPc3b",
- "outputId": "eb31fdb3-93ed-449c-92fa-2dddf97645a9"
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([[ 0.2478173 , -0.08314699, -0.68355539, 0.41125926],\n",
- " [-0.86668575, -0.38280004, 0.15376236, 1.56236058],\n",
- " [ 0.0080912 , -1.29033337, -0.12327648, 0.29641315],\n",
- " [ 0.57417218, 0.76962366, 0.91206458, -0.30103345],\n",
- " [-0.25298833, 1.04734786, 0.51235931, 0.77593098]])"
- ]
- },
- "execution_count": 47,
- "metadata": {
- "tags": []
- },
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# Code along with us\n",
- "arr = np.random.randn(5,4)\n",
- "arr"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "I5UsVrfaoRiS"
- },
- "source": [
- "## Understanding dimension and shape of an array\n",
- "Try making a 3 Dimensional array. How about a 4 dimensional array? It's getting more complicated?
\n",
- "No worries, we have NumPy functions to create some basic arrays of required dimensions"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "A7TXVq-JpGjk",
- "outputId": "426d30e2-3117-4a55-baf6-47169773f5f5"
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([[[1., 1., 1., 1.],\n",
- " [1., 1., 1., 1.],\n",
- " [1., 1., 1., 1.]],\n",
- "\n",
- " [[1., 1., 1., 1.],\n",
- " [1., 1., 1., 1.],\n",
- " [1., 1., 1., 1.]]])"
- ]
- },
- "execution_count": 52,
- "metadata": {
- "tags": []
- },
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# Create a 2x3x4 array with ones\n",
- "np.ones((2,3,4))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "ExecuteTime": {
- "end_time": "2021-02-11T16:37:49.486650Z",
- "start_time": "2021-02-11T16:37:49.476420Z"
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "tC63VeNNtnlN"
+ },
+ "source": [
+ "The plot function tries to give a good fit to the curve"
+ ]
},
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "XhzrGuFyped2",
- "outputId": "140859eb-3775-4b49-a3c0-8614c05fe3c0"
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([[0., 0., 0.],\n",
- " [0., 0., 0.],\n",
- " [0., 0., 0.],\n",
- " [0., 0., 0.],\n",
- " [0., 0., 0.],\n",
- " [0., 0., 0.],\n",
- " [0., 0., 0.],\n",
- " [0., 0., 0.],\n",
- " [0., 0., 0.],\n",
- " [0., 0., 0.]])"
- ]
- },
- "execution_count": 53,
- "metadata": {
- "tags": []
- },
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# Create a 10x3 array with zeros\n",
- "arr2 = np.zeros((10,3))\n",
- "arr2"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "bv1h71nhUbre"
- },
- "source": [
- "Let's first define a **function** that gives all info about nature of array"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "ExecuteTime": {
- "end_time": "2021-02-11T16:37:51.138564Z",
- "start_time": "2021-02-11T16:37:51.131526Z"
- },
- "id": "GeEEzhlrnieZ"
- },
- "outputs": [],
- "source": [
- "# Function code\n",
- "def array_info(arr):\n",
- " print(\"dtype is\",arr.dtype)\n",
- " print(\"shape is\",arr.shape)\n",
- " print(\"Dimension is\",arr.ndim)\n",
- " print(\"Size is\",arr.size,\"\\n\") #\\n to separate the text in next function call with a new line char\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "ExecuteTime": {
- "end_time": "2021-02-11T16:37:51.802366Z",
- "start_time": "2021-02-11T16:37:51.791272Z"
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "We6n3bemlLTZ"
+ },
+ "source": [
+ "**Plotting a list of numbers**\n",
+ "\n",
+ "Plotting a list of numbers is very useful because while training you must be storing the losses and accuracy for every epoch"
+ ]
},
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "-or8aH6jUmqv",
- "outputId": "4153f309-022c-439f-ed13-cf822b7e612c"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "dtype is float64\n",
- "shape is (10, 3)\n",
- "Dimension is 2\n",
- "Size is 30 \n",
- "\n"
- ]
- }
- ],
- "source": [
- "# Calling the function\n",
- "array_info(arr2)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "sbRoILevSSOz"
- },
- "source": [
- "Observe the difference between the following arrays"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "ExecuteTime": {
- "end_time": "2021-02-11T16:37:56.508873Z",
- "start_time": "2021-02-11T16:37:56.494501Z"
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 265
+ },
+ "id": "XjWrZKMmlkH9",
+ "outputId": "2b247b11-2faa-4689-f5b6-b21c9bce3d7a"
+ },
+ "source": [
+ "list_a = [1, 2, 3, 4, 5]\n",
+ "list_b = [5, 4, 3, 2, 1]\n",
+ "plt.plot(list_a, label='List A')\n",
+ "plt.plot(list_b, label='List B')\n",
+ "plt.legend()\n",
+ "plt.show()"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "tags": [],
+ "needs_background": "light"
+ }
+ }
+ ]
},
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "KhlJlUbuSQal",
- "outputId": "13434206-cf0e-4482-efe2-db1607d1bcda"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "dtype is float64\n",
- "shape is (6,)\n",
- "Dimension is 1\n",
- "Size is 6 \n",
- "\n",
- "dtype is float64\n",
- "shape is (6, 1)\n",
- "Dimension is 2\n",
- "Size is 6 \n",
- "\n",
- "dtype is float64\n",
- "shape is (2, 3)\n",
- "Dimension is 2\n",
- "Size is 6 \n",
- "\n"
- ]
- }
- ],
- "source": [
- "a = np.ones((6))\n",
- "b = np.ones((6,1))\n",
- "c = np.ones((2,3))\n",
- "array_info(a)\n",
- "array_info(b)\n",
- "array_info(c)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "Ar56TPLUtfGk",
- "outputId": "91ff3050-2463-4785-ce80-b3b6110709d7"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "[1. 1. 1. 1. 1. 1.]\n",
- "[[1.]\n",
- " [1.]\n",
- " [1.]\n",
- " [1.]\n",
- " [1.]\n",
- " [1.]]\n",
- "[[1. 1. 1.]\n",
- " [1. 1. 1.]]\n"
- ]
- }
- ],
- "source": [
- "print(a)\n",
- "print(b)\n",
- "print(c)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "3WokiWijXZeg"
- },
- "source": [
- "Try creating different sizes of arrays, play around, get the feel"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "p8HoIHXU1BkZ"
- },
- "source": [
- "## Reshaping and Flattening"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "ExecuteTime": {
- "end_time": "2021-02-11T16:38:13.823498Z",
- "start_time": "2021-02-11T16:38:13.813820Z"
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "xaM0XSnZregM"
+ },
+ "source": [
+ "## Scatter Plots"
+ ]
},
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "BiBFZNcL1K3o",
- "outputId": "9f2da707-5586-4ea8-95ad-b28c13396d38"
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([[1, 2],\n",
- " [3, 4],\n",
- " [5, 6]])"
- ]
- },
- "execution_count": 61,
- "metadata": {
- "tags": []
- },
- "output_type": "execute_result"
- }
- ],
- "source": [
- "a.reshape(3,2)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "G5BenCeo1XqG"
- },
- "source": [
- "Try converting arr2 to a one dimensional array without changing the elements using np.reshape()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "ExecuteTime": {
- "end_time": "2021-02-11T16:38:39.149648Z",
- "start_time": "2021-02-11T16:38:39.140397Z"
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "_H90fcAVvUE5"
+ },
+ "source": [
+ "In the above example, let's increase the data from 100 to 1000"
+ ]
},
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "oNBF6bpV1o0t",
- "outputId": "330db064-2523-411e-908f-bd664f0e7b40"
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([1., 1., 1., 1., 1., 1.])"
- ]
- },
- "execution_count": 62,
- "metadata": {
- "tags": []
- },
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# Code with us\n",
- "c.reshape((6,))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "PZVyl2F31xgp"
- },
- "source": [
- "Use np.ravel to do the same"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "ExecuteTime": {
- "end_time": "2021-02-11T16:38:44.384069Z",
- "start_time": "2021-02-11T16:38:44.377572Z"
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "UQKHzT4dtlh4",
+ "outputId": "225ee7a3-9b33-43ef-cc3c-17e6ee1e3983"
+ },
+ "source": [
+ "noise = np.random.randn(1000)\n",
+ "x = np.linspace(-10,10,1000)\n",
+ "y = 3*x + 6*noise\n",
+ "plt.plot(x,y);"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXkAAAD4CAYAAAAJmJb0AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAABAYElEQVR4nO2dd5hU5fXHv2dmtrDsLktZell6EQQVUERRBERBgyaxRJOoMaL5adSYaFRsSdSYoiaaqCF2YzcKRMAGdqT3Ksu6lKX3hWXbzPv7Y+5759aZe2fulB3O53l4uOW9975zZ/Z7zz3vec8hIQQYhmGY7MSX7g4wDMMwyYNFnmEYJothkWcYhsliWOQZhmGyGBZ5hmGYLCaQ7g5oadOmjSgrK0t3NxiGYZoUS5Ys2SuEKLXal1EiX1ZWhsWLF6e7GwzDME0KItpst4/dNQzDMFkMizzDMEwWwyLPMAyTxbDIMwzDZDEs8gzDMFkMizzDMEwWwyLPMAyTxbDIMwzD2PDNpn0o330k3d1IiIyaDMUwDJNJ/Ojf8wEAlY9MTHNP4octeYZhmCyGRZ5hGCaLYZFnGIbxmN3VtThc25DubgBgkWcYhvGc4Q/NwVl//jTd3QDgocgTkZ+IlhHR+8p6dyJaQETlRPQmEeV6dS2GYZhM50BN9lnytwBYp1n/E4DHhRC9ABwAcK2H12IYhmEc4InIE1FnABMBPKusE4BzALyjNHkJwEVeXIthGCZTCIYEGoIh2/1CCAghUtgjM15Z8n8DcAcA+WlbAzgohGhU1rcB6GR1IBFNJqLFRLR4z549HnWHYRgm+fzwmXnoPWW27f7ud83CXz7ckMIemUlY5InoAgC7hRBL4jleCDFVCDFUCDG0tNSyehXDMExGsmzLwZhtXpxXmfR+RMOLGa8jAXyPiCYAyAdQDODvAEqIKKBY850BVHlwLYZhmCaF0Vvz3FffoXPLZhh/QvuUXD9hS14IcZcQorMQogzA5QDmCiGuBPApgB8qza4CMD3RazEMwzQ1BPQq/4f31+L6V5bgm037cMW/56O2IZjU6yczTv63AG4jonKEffTPJfFaDMMwGYnduOs1Ly7EvE37sHLboaRe31ORF0J8JoS4QFmuEEIMF0L0EkJcIoSo8/JaDMMwTQG72JoOLZoBADbtSW6WS57xyjAMk0xsVN7vIwBAfaN9CKYXsMgzDMOkAVL+jxZn7wUs8gzDMElEQODZLyvwdfle3faNSjGSB2euQ9mdM5N2fRZ5hmEYD3hpXiXmbdpr2i5EWMivfHZBGnrFlaEYhmE84f4ZawCYq0ilN6kBW/IMwzBJJVty1zAMwzAZCIs8wzBMgmit9YdnrdPvS3VnDLDIMwyT8RyubUDfe2bj828zM1PtO0u2qctTv6jQ7dN6a9LhumGRZxgm49mwsxp1jSE8MWej5f6V2w7ikdnr0+b/vv2dlY7ahdLQPRZ5hmEynpCijj6y3v/9p+bhmc83oTEOFV217RDK7pyJDTurE+miI4JR+pesBxSLPMMwGY+UP4K1yvsovD2e2aPvr9oOAJizfper46pr3ddwDUUR8mRZ+SzyDMNkPCKi8pYkkgdGnttPNie34cWvK11fK9qbRjQrPxFY5BmGyXhkTnY7GQ7EEPnrX1mMZ7+ssNwnXUFS40OhcF3WWIO8PjvfURSmLbOvnRTNyk8EnvHKMEzmo+ifnbHt94d31NmI/IdrduHDNbvw8zN7mPZJA1q6fHrcPQvjBrSLKfL+OET+wZlrdeundGuJJZsPKP1gS55hmOMUKX8+G5UP+MJSVh+HT16K6yfrIj75j9fuMr0V/Gf+ZnywegeCIYFgSKhvD27I8ekl94endFaXk+WuYUueYZiMRwqxnSUfy10TDRnVMr9iv22b6curcM+01QCAvu2KULH3CKZM6O/6WgG//gNonxM88MowzHGLMLhUjCQy8OpEXG95Y7m6vGFXNRqCAn6/e/kMGI4hItx/4YBwP3jglWGY45VY/mppISfirnFLPO6aPdX6Kqg+IvUBFWSfPMMwTYVXF2zGnHXu4s61hEICVQePqetqBKWtTz65lny0ayaCjyJvJzzwyjBMk2HKe6tx7UuL4z7+ibkbMfKRudiyrya8QUbX2LRPLE4+PakQBndugTH920VEPklVAFnkGYbJOL7aGK6wtPNwLYBInHxICNTUN5ra5wbCUlZTH3R8DSEEjtY1xh3VkqjlPf2mM9CiWQ6km57dNQzDeEptQzAhl0q8zF2/C0u3HIjaJuKeCf8vrdwvN+7FgPs+NLUvzs8BABw8Vq/bfu+01bjhlSXq+rzyvfjB0/OwYutBXPqvb3DC/R9il8ZPvveI3mceDa/qb5NqyXMIJcMwHnLf9NV4a/E2zLz5DJzQsUXKrvuzF8NuHGOZPC3ShSLdM7GsXCnyU95bjV2H63DbuD4AgFfmb9a1+83bK7D9UC0m/fNrddvW/TXq8tAHP3H2IQAEE/CvaD+7n33yDMMkg8q9YXE7Umt2f6QbsyWvF8ADR+sx+Hcf4ZnPNwHQx5/bpSMGgO2Hak3b6hqcu3i0/Gf+lriOMyLHEzhOnmEYTxFpr1kEvL9yO87881ydX7y6tgHb1cga6/DCya8sxqFjDXhk9noAZitYa53H4nCcD7kNu6KnJv7R8K644tSuMc8jH2ScoIxhGE+RumgXlpgKfvvOSmzdfwzHNNb0hCe+xK7Det+4UQC/23tUXV6z/ZBp/5l//hTHHA7CHqlL3pvMgA7FMdtELHn2yTMM4wGn/3EOerYtVNfTqPEq2jDGrfsj8fF2Vq72wTTxia8wbkA70zmPWkThpJpcB7Ni2SfPMIynbD9Uiy837s0AZ01ErAWAQ8ca8MlafbSPlHJjHnbjPCSryBS7FAipQyAnELsP8h5wgjKGYZJCuqUQCIv0rW8ux2cb9Ol9hWa/FqOAW0XfXPPiIk/76BYhItkxo6G6a3gyFMMwXuJ0pufqqkMY8vuP1BjyK/49H9OX2xe/cIMaIhkSqNT42SVS3I0ibuy6lRW8YutBL7oYk+HdW1luFwLIceKuUZqwu4ZhGE8xhinaMfWLChysacDX5eFZqPM27dNlZYwX7cBoMGQd6xMMCYRCAlPeW63bbqzlmqbMBADsJzEJCOS6cdewyDMMkxyiC1GyLMwn525UL72o8gA27zOHPQaFwBGLAVRjBahk+bOd0GAn8g7dNbKQSEMceXecwCLPMMcpTrU7VlWmeKltCKmPlxtfW2p9bWF9XWPYY7KsYCfYzXwVcOauaZYbblObJJHngVeGOc6J5ZtXUwyQ3jWx90gd2hTmxX1dJ5l6H5y5Dut2HI7ZLll5X2Jx7oB22GIz8UoIOHLX5Of4AYRzCSUDtuQZ5jhFjVyJoY/yGXDTa8twuLZB3b5q26GEru9zoPJOBB5InkspFpNH9bB1FQkIR+6aZizyDMMkBRFJ36tld3UtjmrcIdr9lRq/uXHw047tB4/hnSXblEtGzkXwbrZtPBWhJD1Km8d9rN9HGNGzNQDgwYsGmvYb3TW92xbi0UsG67Y1yw2LvNMZum5JWOSJqAsRfUpEa4loDRHdomxvRUQfE9FG5f+WiXeXYZhEaLQQQ6OrY/hDc3Dhk19F9mt2awW/IejMeh7z6Of4zdsrcKimQWf1eplOYXWVM4vfyMldS/DSNcNdHaOtCJXj9+HeCwbgs9+cjfMGttc3tHDXXDK0M35wSmfdNmnJH8tgS74RwK+FEAMAnAbgRiIaAOBOAHOEEL0BzFHWGYZJMlv21VjGnAPAw7PWq8vR3DUVmuO1hr7Qibwz61mK17jHP9cNkPooM1IqOOnDrWN7ozAvPIR5n1J4Gwhnv8zx+1DWprmankDidOA1P9NFXgixQwixVFmuBrAOQCcAkwC8pDR7CcBFiV6LYZjYjPrLpzj7r59Z7vv8292mbbEjUyL7tbpuJ/IHjkYKd8xetUNd3l1dZ7DkY1zWA96cfFrMNk7eKAikuoQKciPxKlqr3hgFJIQwiTxZhKvmBXwgAmoz1V2jhYjKAJwEYAGAdkII+Q3vBGDOIBQ+ZjIRLSaixXv27LFqwjCMR2iFSGp7rEFL7W6tSGvdNYsq96sDh9f/J1KJ6Rev6kMjtccfrQviYE0DkklpUfToHwHnaR1k/djCPL+6TTuwajXGKq30aBARhnVrFbOv8eKZyBNRIYD/ArhVCKFzkInwO57lL0kIMVUIMVQIMbS0tNSr7jBMyjlWH8ROi6IUqWSeMivVDr/G8pRzTO1CKFdsPYhfvr5MN9lHa73L5S37anDJM9/gnmmr1XU7tCL/4rzKqH31An+MCB67OHwrCpQBUq1wa4uVGK8lNMfE4q0bRuAnI8octXWLJ3HyRJSDsMC/KoR4V9m8i4g6CCF2EFEHAOb3RIbJIq58dj6WbjkYtaydGxqDIew7Wo92xfmOj7ni2QXqcm1D0GRJkoUlb+dav+n1pdi6/xjKWheo2+obzSIvwyrXbI89+PnQzHUx23iJEwF36jaaduNIzCvfq7PedZa8yV0TdsXEcy0v8SK6hgA8B2CdEOIxza4ZAK5Slq8CMD3RazFMJrN0y0FPz/fA/9bg1Ifn4NMNu7HrsPs3hJr6IGobgrrQPK2LOJa7Rk502qMpdF2vs+SFck4lXbCDWPW3lVDKZHJ234hHwM6SP7N3GwDO3TVEQJ92Rbh6ZHedWyaWJZ/OgiwSL9w1IwH8BMA5RLRc+TcBwCMAxhHRRgBjlXWGYRzyydrwy+81LyzCqQ/PcX18MCRw9l8+Q//7PlC3WVm2z3y+CR+u2Wna3rp5WOSPah4SdY2RZWnVv/zNZvV6mcCEQR3UZTuRv3RoF3XZiRBrn1/aKBrtwKsxuiZTSNhdI4T4CvYPwzGJnp9hjlfsNGN+xT70aNMcbWO4cUJCYKfhDUA38Kr8v2zLQVz/yhKTm+mTdfoCHoDeXRMSArUNQby+cIu6ngnkaKxrO3eNVvzdarP+WM21jJa8xf1Ih2XPM14ZJkOxk4Ofv7QYL31TadpuFBVjNSVAL2hWIhTL5aIV+b/P2YgNOyPFrJ1G63hB55bNcMNZPS336X3mMUReCNdFU7Qib1Xer3Xz3PCpXZ43WbDIM0yGYmf11dQ3orbBPFpqdJe4TdoVDAncN31N1DbGFL+3vrlcXa7YexRld87E7uo6JJuGYAh3jO+Luyf0M+3TirBdfpxcZUC0MSRcD87K8/sokpJAUvnIRDzwvRPCK8rtn3/XGEwa0jHmNZIFizzDeIzTikvxnDcYEggJa/+3cVKTlSUfjdVVh/DK/M1R2yz8br9uvbo2uXHudjQEBXw+wrAyc1Um7ZuE30f41dg+AIDrR/VQt+cH/Mp5Qo7cNUX5Ec+2fCj0aVdk2VaeT4aotm+Rr0ZI2b1ZJBNONcwwHiOEN6FyxnM0BIUqYFYib0xrHmsg1PgscjIF/yNDoe3qWnNBD68Y0qUEy21K+MnwTauB1ZBhkPSWsb1xy9jeAIB/fVEBAMjPUQp1BIVuFur5A9tj9urIIHT3Ns1x1Yhu+PFp3dRtsSx/eT7t/f3lOb0QDAlcNqyLzVHJgy15hvEYtwUsPl67y1LMjFpSHwyp1rmVlW68bizfuLG9NhzQKUb3jZdEM3qlyFsJrtZNZZfpV84fqG8MgTRtOpU007XL8ROuHtkdAc0DMNYDnCLufpWi/Bzce8EARzNgvYZFnmE8xu3A43UvL8ZF//zatN2Y56SuIaiWiLOqRmS03C+2OGe09o0Os0qmCisrvV/7sItE9tXqwaRz19gospyk1BAM6e5yrBmyWuy+ZnkG66q1qYdFnmE8xiuXvFGf6hpDaAhJkTe3Nw60Ho2R8Mr4MGq0KWOXLqys9Hf/73QAkTcZKxHv3TbiKzeK9vVn9cD1Z/VQLeqwTz72QK2WeCz5dMI+eYbxGK8mBRm1JBy+6FOuoRfkDTurdVWbnGDsp9P88KnCyqqWA6YSK1Hu2iqShsEYoXTX+f0BAPuVTJmNQaFzC5nSBUe5JXaWuhzbMEbepAsWeYbxGK/ixI0CVdsYVK1Eox6P/9sXsfsVEjpr3+iesSookk6sRN7nI0wc1AE/OKUTAOtoFXLgn5ADr/XBkM4t5sSSl28Ydl/z2X3b4pYxvXHNyLLYHUkB7K5hmDg5dKwBNfXm6BIrr0f57mq8uzR63pZ/f1GBTXuOqOtGuWkMCtXatvLJx+Kyqd9ghaYuqzEfvNuQy2RjFPnLlciUf155Ms7pF85cbuXScRL3nqe8EZzVp1TnfnHiko/43K3x+wi/GtcHJQW5sU+WAtiSZ5g4Gfy7j9CuOA8L7h6r225lyY99LGxpf//kzqZ9kodmrcO/vtiExfeMC28wCE4wJFRhjmeQdFHlAd16SUEO9mkKfDit9JRsJp7YATNX7jCJ9dl925raWln7fiJ89KtRWLr5gGmf9rgv7xiN0qI8/UQnF7GvyZoP4TUs8gyTALsOm2d3JuKuOaIpoG2y5EMCvqB18e14MFru9UkMh3RDK8UCdhLpYumuUTJG2k1WknRRfPfazy3dNd1aF2CzTV58aaGP7NUmZv8yAXbXMIzHuI2T16K1Xo0++WBIqNE1XrhWGgyivsOm4MmCu9OTZ9CJ68TKh+60CIhE764Jr/Ro09y2fWlRHr64fTTuvWCAbZtMgi15homDaFZvIkY22SwDYZEXhhmvZXfOxA9PsXcB2VGQ69dVfAKA+2dY561xK5qJEPCRKrrm55j5xlq5V9xmDtB+PjnnKZY3rKumkEqmwyLPMHFw6Jh9uGI0V4oQImq6WdJZ8vp9wZBAiCLLknfiKMQRDAnH0TSpTLeiTa1g9Hlb3VZPLHmLY90md8tk2F3DMHEgi1ZbES1O3rjPKGRafTLOeG0MhSIDrwmKUEgIxykJErXk37lhhDpTNRbNcv2alMWx29v55N2gbT+mfzhq58bRvQAAtyrJzZoyLPIMEwfRRDaau8Z4nFH0pd5s2VeDDbuqdfuufmERVmwNh0DGk0ZYS0NQoKY+iKK82C/ziYr80LJWeOcXp+PLO0bHbPvG5NPUZSeDy3JwVlsoxG1hDm377m2ao/KRiRjRszUqH5mIiSd2iHJk04BFnmHiIFqcejRL3ihcFXuP6tal4EyZtsry+Mc/+RZA+GHhZmbt7mrrQdWfnt4N918YfQDRbnJR55bNrHdYUJgXUKNZ7LjklM66iBjjx7P6tNKS/9Hwro77crzBPnmGiYNolnw0C1QrzAeO1uPcx/UzVaP5+o3ncRPXvv2gtcjn+H0x3SJ2lrxM8uUVakFwRc6d+OQDfh/W/n488gN+tdYso4cteSalrNp2CAsq9qW7GwkTbTJSNNHUvgActBH0zfuOWm7XEgwJ1LsQ+R88Pc9ye47fF9P1YzfwKo964MIBuGpEN8s2n99+dtRzd2iRj3bF4YLh8dY/LcgNOEpHcLzCIs+klAv/8RUumzo/rX2obwzhd/9bgwOa2Z5uiWatR7XkNfvs3C21DaGYghcMCVOcezwEfBTT921nyV9wYrik3bkntMfvJg3ET07TC/2oPqXo1lofby7L7l06tDMev2wwvrlrDMaf0F65jv788h7IN4aBnYodfCLGCLtrmOOO2at34IWvK3G0rhF//uHguM4RzV3z8dpdaN08F60L81B250xdoqpFlftxdt9S5AX8tuJKZF/EO3L9kCdZIwN+X0y3j93z5pfn9MJVI7qhdWHYEv/N+L668oEndSkxHbPivnMhIFCQG5EeWQzb+DAZ3bcUgzoV4+dn9EDL5pmRB6YpwiLPHHdIcY23qtGXG/dg2rLttvv/8uEGvL9yB2bfciYA4IWvK9V917+yBADw63F9MHZAO8vjnaQXCAlvcs34KHYUi5xwdELHYqzZfljdnuP3qQIP6NMQfPyrUehRWmg6l1X63bwcKfL67QEf4fbx5kLdjDtY5JnjDmkxxpv3/SfPLYzZZt2Ow1ETWD368be65GBa6hpjF5duDIU8K72n9cn/dEQ30wBmwO/D+j+ch9VVh/DDZ76xPY9WpHvHyBujJdcfFv50zz8qzs9OOczOT8UwUVCjOAQwY8V2nN6zNdpoLFKviCVaL86rtNxe1xi9ohMQHsCNZskX5QccF9nO0xTi6Ne+GBsePA+1DSEM/t1H6vb8HH/MhGHxxtNLS15WpkpHcscXrhmGvi4eTE0JHnhljjukGO2ursXNry/D5JcX6/Zv2nMEfabMdhTlEo143xTqGkMOffL2In9i5xaOr/fT0yMDpjl+Ql7AjxbNckztpBvprD6lqitKi5v6qFqkT76+0XC/UpgzZ3TftuhY4jzuvynBIs80Wbbur0HZnTOxcttBR+2FEHh41jrcM201AOBoXdhi3mnIvvjfJdtQHwxhxvKI33368io8/9V3rvq3fKuzfhmpa4jthtl1uA4zV+2w3PfC1cMwsKMzkSeELXkZwZIbJfZ9ePdWeOzSwZj601PQv4M50iVeS15eUx4u66/muHxozP31WXj+6qFx9SGbYXcN02T5dMNuAMBbi7fixM4lMdtv3leDqV9UqOvSPWAMV5SzKLURNLe8sRyAuxzil/7L3n8djbrGoKOY8X99XmG5vUurZlhU6U4g5WeNNsGJiKIWPYk3VF2OXUix/9W4PsjP8eEHLrNr9igttBzsPd5hkWeaLDKEMOBz9kK6cfcR3foOZRZo1cFjuuyQfuV8VlEnTmqpJooTd000/D6fLpujE6Rrye1xWuKdzFSvfI/SbVOYF+CoGg9hdw2TUXyweqeLqf1hS9wqE6EVxtDEak0VplmrdmLasioAkZzibjI9rtl+KHYjhyQaNRPwkeryiIVRmKO5a5KF/F7Sce3jAbbkmYxhy74a3PCfJRjTry0aQwKff7sHGx86H/+YW47Jo3qguSFjohRhv9+ZyEer2HTja0sBABed1CliybsQ+cq91qXi4qGuIZjQmGPAT8jPiU8wE7HkJW4zN6oi78G1GTMs8kzGcEzJ0b71QA2+3RV2rby7dBv+PmcjauobMWWiPluizB+T49Bd47TwstYnv/9oPb7beyRq+2teWIhPN+xxdG4n1DWG8Mm63XEfH/D5dGGRbkjUml77+/GuxXpI1xIAwLDurRK6NmMNizyTERyqacADFuXnpJVXU2+OHZeWfMCpJe/QMpdWdDAkcNm/vjH58o14KfCAN+6aWC6sF64ZhmteWIRTurXUbU/UmtamK3DKWX1KseSesbrZs4x38PsRkxH86cP1+EbJTqkLxZPl2ASw+7A+1HHhd+H2Tn3yTkVeZncMCRFT4L0mL+DD0Tpnk5gkr/38VN16wE8xi4mP7tsW5Q+dj4Gd9KGW6fKLs8AnDxZ5Jq3UNQaxac8R23J6sg7p6wu3YPjDc7B1f8T3Pb9iP4DwtHsnOKk0BETeHlJZwFqS6/dh12Hr3O9WEAEFhrGKgM+nPtCKokzVt7pv7BfPPvgbZdLKfdPWYMyjn2NPdZ26TRvxYXTT7Na0kxgt+a37a/DHWetMA6dO8nkJESnG4dSH7yXVdY14f6X1JCcrAj4yCXPAT2rfvze4I/77i9Mdny+HI1yyDv5GmbQyX3G57Nck69JKttHCt3LNGKfTX//KEvzriwqU79G7WpxY8sGQUC35WC6PVFH+0Pk4oaN1LvWQAPq1L8LkUT3UbQEfIU8JoSxuluPYnQWwJZ+N8DfKJI2qg8dw3t++sK0vCkTS2Gpj2NfuiKSz3WOw3K3yoxjdDvLBoG0aCglMX14Vs8+NWpFPd1pEALeP7xvVHRUMCfh8hLsn9Fe3ERG+f1In3D6+L24+p7ernDIcq559JP0bJaLziGgDEZUT0Z3Jvh6TObw8rxLrd1bj3aX24irLttlFlLyxaKtu3UqwtDlONu87qhbH1vrU31tWhUWVB2L2uSEYUmdgRivxlypuHN0LgPtcXQG/DzeO7oVmuX7H0UcAW/LZSFK/USLyA/gngPMBDADwIyKKXhqeyRqkb31FlERdAVXkY6fXBSLWtTYDo1b4//TBenVZ655xOou2IZhed805/dp6fs7CPOdhjWzJZx/JjpMfDqBcCFEBAET0BoBJANYm+bpMBiCtz9mrd5r2yVwx0to+ZhEHb0VQcbt0bVWguU5E5LUl8bSpa/MczgBtDIbUEMp0uGtG9mqDuevDE6H+fvkQV8fee8EA/HfJNtP2Di2cp9DVPjAfvWRw3OmDmcwh2SLfCYD2fXsbAF1QLxFNBjAZALp27Zrk7mQmf3h/LZ776jtUPjIx3V3xlGj6IET4ISBFxGqykxWNIaFmhIycKyLGWgtfZpkEnLshGkIC9cpbhZvcNfHywa1nQgjg/L9/CQDQelbO6lPq6lzXntEd157R3bRd3uOh3Vpi8ebYLiuJ2yyQTGaS9nczIcRUIcRQIcTQ0lJ3P+ps4TklT3k6QvaSCUXJpShdIT6LtL7RsIqQ0W7S+tG/23s0PPB7uNaxG6IxGCmQ7SZ3Tbz0bVeEPpqKRFrL2apwR7ys/f14vHbdaZ6dj2k6JFvkqwB00ax3VrYxFjQFjX9pXiXO+etnum3zyvdiXvlePDxrne5BFc2Sl2JtF95n5yawGgx9X1M8o15jyT//1Xfhgd9lVVHzpGvR+uS9suT/cNFA231hl1VkXT70hnQpiTt1rxUFuQH2tx+nJPtbXwSgNxF1J6JcAJcDmJHkazZZEpGUxmDINO0/FjsP1eL2t1fYzja14v4Za9ToFckVzy7AFc8uwNQvKnSTlXxRVF56Uvw2QmYn8lZ+8i++DeeOWVS5Hwu/22/a/+qCzdh7xLpotpGxj33uKoRygEWFJCOxHjBaMZf3o6TA2or/wcmd8cq1w+N27U0a0hFj+7eL61imaZJUn7wQopGIbgLwIQA/gOeFEOYsVAyAsHXrj7NcxIMz1+HFeZVYcd+5aGEjEEYe//hbvL1kG4aVtcKlw7rEPsACo0tD+zYSzV0TUt011vsDPoKVLEeLeLnkGX0lJimeW/cfU0v+OaEu6NyS18b02+Li6S0fjHZ37urTyzDIRf1WI3+//CTL7Q9cOAArq7zLic9kDkl/fxNCzBJC9BFC9BRCPJTs6zVlEnHXyIiMAzXOLFYAaNk8FwDUyUr3T1+NBUqSMKfUR8kVEM1dI8W6ZUGu5X47C7/R5npfl++1v5hLGhRLPhQSaN3cun9uEBD45q5zHLWVnzvVeXOuHtkdj106JKXXZFIDO+kyCJGAw8aqLmks2haFM/9JF8tL32zGZVPnOzpWCIGXv6nEDkMRbO1n+G6f3q3z5cZISt4t+2pwsKbetoKRXQ6VBpsJSlc+u8C0Ld5C2vWqJR9KyIUmEcJ5GKN0U6UhNxqTpXA++QwiEUtezmp0E9stBbYhGHIdSbJ2x2HcN30N+ht80trTGGe6/uS5heryBU9+hTaFeTith3WhCG0uGy3R3hy8QuuTP+Iy7a8Vxjt7ctcSLN1y0LJtZCyCVZ7xBhb5DCIRkZcl67Sx4W5wO7tz4hNfATDneHfzsNh7pM71hKP3lpon+3iNFPmDNQ2murBaurYqwJb95rJ/PzmtG16Zv1ldN97ad/9vJMp3H8F3hgHsS4d2trXkR/RojdVVh9GqMOI++vKO0Y5ruTLHLyzyGYQX7ppYotkYDOG2t1boshY6Oc4OY84ZeZ5Zq/Tpcu3mABx1OAlK4nUVJitk0Q67giFL7hmLWat34px+bTHykbm6fRUPT4DPR3qRt/hee7UtRK+2heq6jJaZrdw3ox3/2/P64cpTu6FTScTt00Uz65dh7GCfvAsWVOzDvE3eDfAZScySt/fJ3/LGMlz/ymIAwNYDxzBjxXZc/8oSVXyEcF5Qw4jRfSKvf9tby3Xb7XzpMvwx1UTzeVfHcNG0LszDT07TC67EKmzUza2VTY0DrwG/D2Vtmjs/EcMosMi74LKp83HFv80DfF4Rr9AC0S356cu348M1uwBEEoHV1Dfq/OdSnN0O+BndGfL6RpFymoAsVbi51a/+/FT84wrr0MPXrjsV90zsb9p+94R+kWvF0S8eeGW8gkU+g0gkkkNa8g0xBiara8NW6tH6oM6FIn3piWqLvcgnf8DUKVee2hXti/MBAE9deTJm33Jm1PbDu7fCBSd2tNx3es82+PmZPUzbJ4/qiStPVXIxuXiiqPMHWOUZj2CRzyC8iK6JlQO9ujaccjfHRzqr306c3RK0eVikUuQ7tsiPuv+hiweplnLbojz0KI3uBrGL2Y9FKyXGvrmLVL/qN8Iaz3gED7xmEh5E10SLBgEilnxBXkDnrpHRNYkakDK6x+ibrnOROiFRLhjcEVO/qIjaRuaXLynIRV4geoSK/CyzbzkTOS4KcNx0Ti+UFuXhoiGdHB8j2JJnPIYt+QzCC5/86u2HMOyhT0xl8yQyT02u36cLd5SRl3ZJsY7VB3G4NnbhDfkZzjuhvW57Ki15JwIpUxu3Kw5PCBvbX1+so3NL86Bq/w7F6NW2yLTdjryAHz8dURY1h48R1Sfv+AiGiQ6LfBr56fMLUXbnTHU9EZ+8FPmnPtuEPdV1+FRJc2BE6roQQvdQUS1wG3UZ+9jnOPGBj2L24wdPh/PHGEvOpcsnX5yvf1ldePcYAJFqSfL/Rw1T+t1UU/KSiE8+LZdnshB216QRY/hgtHzym/YcweFjDTipa0vL/XLgVbpr7IxZeYmQ0M9OVS15Gxuy6uAx274Z+WjNTtPYQCrdNVraFObhcG2jbh0AZt58Bir2HlXfXIxumKL89PxpRKJrWOUZb2BLPoOIZsmPefRzXPzUPNv9RheFVareRz/agE/W7VKuJXTJzIIeWpCTX1mCz77Vv0kkYsm/nkCxC+N9kK6Tbq2bY3TfiIsmYEiHmS5LXv4GWOMZr2CRzyAS8ckbRUGK2wtff6due3JuuZqtctfhOt3gpIyKOVofxLRl4ZwzH63ZiV53z0JNvfv8LcbcM2u2O0jJa0MiVnWOw7J/OX7SFTBxExHjJfI3EC1NM8O4gUU+k1A0/mBNPdZsd5fb22jJy9f93/0vds30NxZtxfTlkWRit765HADw+Ccb0RgSqNhz1OZIe4wi9acP1rs+h8StVa29FX+55ESHxxDKH56AMf3C1n263DUTBnXAOf3a4rZz+6Tl+kz2wSKfQUg7/vtPz1MTgDnF6GZx63Z5cm65aVt+TvjnEY+rJZ5skU9debLldiLg7RtG4MEoZfS0aF+IerQptG9ogXwDSoa7pk1h7Nz0hXkBPH/1MMuUCQwTDyzyGYQUJ6PlLN0nQLiwhxXGgTov4qxl2bpUpSQY1Mm64pEQwLCyVmr+eyt6ljbHpUM7m7Zro3yGd7dOa2zVPhnumrm/ORsLlOgehkkVLPIecMsby9TsgYlg55Nfse2guvzSN5st2xg1PVGRX7J5P+ZXhOulpir80a6uq7wrdoVEAGDOr89Gt9bmmataP7uTmatyADYZlnxxfg7aFUefjcswXsMi7wHTl2/HL15darnPTXFtu2FXJznazQN1idU0kvHuQOrCH42x9RLp5sixKwgbBe0bjt35dX3wyZBK/tNgsgP+JSeRT9fvxvCH59hOTDJiFScfDAlb612L0QhuDImocfduSJUlbwxjHDegHSofmYii/HBhcqcvJ0TAgrvHYOm943Tbf3iK2Z1j6oPyILB7q2CYpgaLfBJZptQYdVpr1EqTP1yz09GxRgEMhkRCCc+03PLGcm9OFINYwhorw6aWdsX5aoIwySQHOWRkDiCPbh3DpB0W+QzCKMrBkMA906wHWrXsqa7DW4v1ZfGCIZFQ3H2quG1cJFQwYBB5q/uhxZiywAvUiCKXLqpzB7TDRUOs0xEzTDphkU8iUrK+3Ois+pGxTNyqqkO2Ba2DIYHtSqqBe6atMu1vDAnEWdEvpbTWhBXG8pkbq0u9cM0wz/tTkBvOSFnjsizh1J8Oxd8uty4swjDphEU+BSzdctBRO6PlGs0Sf3LuRpz+yFxsO1BjWVqvqVjy2geR0SdvdJoMK4vk7fnqt6NxSrfYIZFuKcgNvx24FXmGyVQ4QVmCeDW4CZj9wHanrtx7FPM27QMAbNlfYzkBvjHFIr/i/nMBAIN/FztTpQ5NH40ueWP3WxfmqQWvk4W05GsbgpgyoX9CxdUZJhNgSz5BvNRRsyhbn/yB/61R47iv+PcCy1ahFLtrmuf60aJZjrq+6oFzHR8rUwkYJ3SlIxNjsxzprmnEdaN6YPKoninvA8N4CVvyCRJNR91qlNldY93OR6SbrFNrMUiYakteRsYML2uFCYPaq2GPsRAAnvrxyWqlpkVTxmL26h24b/oaV1WYvGJ0v7bwEXDlqd1Sfm2GSQYs8gnirZDqz2U3CcpHQElBREStRD4YCkGksE6HtLrfumGEq+OECFdQalsUtqBLi/LUN4KARxOSLj6pk+MHbrvifFT8MbkuIYZJJSzyCeKlyBs13e7MRIRjmoHB2gazmj88az3at8j8JFdWYxpyIDnHowlJj182xJPzMExThH3yCaLVqANH6zH+8S/w7a7qmMe9NK8y6rms1iU+AmoatCJvHQly8+vLYvYjFl67xT+49UzdutVHlJOeOLUAwyTOcf9X9OXGPfhgtbNZpVZoLfkF3+3Dhl3V+OOsdTGPu3/GGtM2YySHXeTOlxv3Giz55IX7ee3WdzLu0KiIvJNcM1ZwQgKGiXDci/xPnluIG/6zxNb/XXXwGN5evFW3bdqyKtyrzETVHtZaqR+6eV8NAPfVfZwOvNbUB9UKTwBQa8gt06eduxzqmYbqrmFLnmEShv+KFC5+6mvL7ZdP/Qa3v7NSZy3f+uZyvDI/nDRMa23L4tUVe4/iB0/r67HWNgTREAzpLHAjRv9+MIYZLSNajOccaJOX3Uui5XZ3g9XbSqNSVdyY5oBhGPfwwKvCim3W5fb2VofTChjzpki0m7Vtlmw+gCWbD6jr/e79QF3+6FejLM9lztUSPTymINeP6tpGHNM8gKbfOBKvLdgS9bhEmTyqB/63YnvSzi8tea+iaxjmeIb/iqJQvrtaFdD5Ffss2+gs+RiiLNl9uM5y+5Rpq/HVxr3q+sZdR6KeJ8+iiMbgLiVx+7Kd0KVVM9w9ob+uKMny+8ZFOUKPk8HlRtVdw5Y8wyRKVov8E3M2os+U2Y7b/3eJPpPj2Me+UJef/myTqf3Nry/DFE2WyPLd0UVZ0izX+rav2HoQP35ugbr+x9nRi1/nBfyW21Phy9ZG3ZQUxK5dGmmrnyRllTage2m4wlOfdkXxdY5hGJWsFvnHPv4W9cEQ6h0Wvfh6017bfYs1rhfJjBXbMXNlpOzfgzNjR9UA9gOqbsm1KYfnxJf9tstJS0biKS84pl9bdCxphtm3nImrTy8DYG3JX3hiB8y4aSQuHMypexkmUbJa5CUHaqzT9aYLO/++W3JtLHYnvuyBHRMbnHUzJtpcSfr110sGAwD6dyhWXU1Wt4KIcGLnkoT6xzBMmIREnoj+QkTriWglEb1HRCWafXcRUTkRbSCi8Qn31AXSTy4LQOw7klki79UsWTtLPteBLzveSU6y6z4XKn/ZsK4ADIW4k+Bu9zIjKMNkC4la8h8DGCiEOBHAtwDuAgAiGgDgcgAnADgPwFNEZO1A9pjPv92D7nfNQsWeI2pGwYOKJb9k8wGU3TkTa7ZbR9KkivunmydCxYPVwCvgzJJPtIap38VTYsrE/lh67zhdUjVJoql8vze4Ix66eGBC52CYbCYhkRdCfCSEaFRW5wOQlZInAXhDCFEnhPgOQDmA4YlcywkNwRCuen4hAKBy31HVFdCgLHz+bbhC0/srd6By79Fkd8eWjQ4HaGNhtORf/ln4FjuJrnHiU+9Z2tw2f7sbn7zfR6Z6q8VKlsrmuYlF8T7xo5M4YyTDRMFLn/zPAMhQlk4AtNNEtynbTBDRZCJaTESL9+xxVibPjveWVanLzXMD6vR4OZu1RMlu+PRnm3D2Xz9T09s2VYzW+Kg+pQCAHFOFJTNODPmWStTM9BtH4q3r9QO1gzon5tO/7swemDKhP644tWtC57EiDWnoGSZjiakGRPQJEa22+DdJ02YKgEYAr7rtgBBiqhBiqBBiaGlpqdvDdWijaIIhgUZF3OX/xvC9o3WNunXpOSjfXY2yO2cm1JdU8OVG62ggJ5a8k4Ic0pEyuEsJOrTI1+178KLEXCS5AR+uG9UjKeGe7JpnmAgx35WFEGOj7SeiqwFcAGCMiIx8VQHoomnWWdmWNDbvO4pHNHHlDRqRlzNH83P0wwJ2A6Cfrk/sjSLdpGKmqPFeMgyTmSTkECWi8wDcAeAsIUSNZtcMAK8R0WMAOgLoDWBhIteKxXUvL8YRjWUeDIXUUMWI2BuLciSzR8knL+BDncUcACfRNU6IFa1yVp9Sz3LYMAyTHBLNXfMPAHkAPlZe/+cLIW4QQqwhorcArEXYjXOjECJ5+XBhLpwhp8YDwM5DtWgIhkwib0pDoGhjU/HpNsv1W4q83UxYt2hvV7EynnHeCe3VbS/9LOlj6QzDJEhCIi+E6BVl30MAHkrk/G4wCrh2/cGZ67B2x2GM7NlG16YxlZWuk4B2MtTt4/uqy3ahlYnQolkOltwz1lUKg3TRVB7SDJMKsmbGq9G/bhTwD1fvNKXuNaU7aMKar83zYuUvL84P4NaxvV2d03g7WhfmuYqv//7JlgFVDMOkkKwReaOoGy17H5GpMIgsMyd5d1kVbn0j8ZJ5qUL7GbX5aqws+VF9SnHr2D66bR/ceiYKcqO4dhIMU3ns0iG2cfbJ4JKhXdC7bSGu4Lh5hlHJGpE3irpRwInMD4KGoFnEpi3fjuraRtP2VDHvznMwuq91KGm/9vqsjNrPo7Ww83L0X+vDFw9S88boz1eszh2woqm92LQrzsfHt52FTiWZX8CcYVJF1oq8cd3vI5NLx/ggkLxlKPeXSjqWNFNzvUiGdCnBzJvPwJuT9ROStG8m2tj4XL/eOu9R2txRyOP0G0ei4uEJ6sxZjjdnmKZP1lSGMrpijFa730cm4a+3EfkjxklSKWJot5YAzLNRn/nxKWhvmIwE6D9jQDPL1TjwaJfILNw20tjvI/h8pD78rHLNMAzTtMgeS95gdm7ao88PQ2QW+QabPPOmmbAA/n75kMQ66ADpZjEa0HZjndrP3K11gaa9/oB8hyGV0uUjH3LDurdydBzDMJlL1oi80XJ/4etK3bqPzC6cWhuRN0ZW9mtfhElDOmFkr9YJ9zMaUoyN/Sywsah/NCwyqbhdccTSL8rXt8/PcfY1y4fDxEEd8PDFg/DLc2wjZBmGaSJkzft4rEIcPiKTtf+3T751dO6IhRv/fK6Aj2LG5Uu3irFdc4sImCX3jEXLglwM6VqCzi0LdPu6tCrAa9ediiv+HS4lGM0frzX6Zdh9wO9LSuIwhmFST9ZY8k5E3ui3r9jjLN2wtHCt3Dh2XDREX7rOWGTjghM7mI6RoY/BkDEyyOyvKcgNwOcjXHxSZwwrM7tVTtdM/HKaZyaekn4Mw2Q2WSPyTvjrR84sdyNSn28e43wykemZY1g/q485THJwlxIA+pQMdrjR42juGr0lzyLPMNlG1rhrYlF18Fjcx0or/HuDO2Ljrmo8Obc85jHacE0i88Cw1jpvX5yPZ68aihM6FgOIvJV0adUMD1x4guX53Qiy04FXtuQZJvs4riz5eNGKn5M87IA+xnzObWeZYvS1GR4FBAZ2aqGeW1ayOrN3Kcb0bxezT7GIVo+VNMVW3dRtZRimacAi7wBtPVOnOqgdI+hRWmiaWKRdNbp2gkqceiDKxZz0w8olZETnrmFLnmGyjuPGXZMIWu2zs6D/+P1BuOvdVeq6XUESic6SN7SVLvloLhknbxTPXjUUtQ36iKCFd4/RpSfWnsVB1UCGYZoY/GdtoMgiJl0rtla6e+8FAzCgQ7Fum9E6Nw7aavcb2zY6sOSdkOP3oShfn5umbXE+urQqsGzPljzDZB8s8gb8FlWVrHzy4wa0UwV/SJcWJgs/JATuvWAA+rQrBADcNq4P1v/hPHW/EPq2WuTEpq42YuwlxrQGDMNkF+yu0XDT6F54Y9EW03Yrd02P0uZYU5WP7Ydq0bYoH4eONeiOCQmBa8/ojmvP6G46Vu5Xlw2m/KQhHdGiWY6lT33mzWdgfsV+dx/MITzwyjDZx3FnyV9pM5Pzfzedgd+M76tL9CXJ8ZuTfwkB3DquD/w+QvsW+SZL3mpyllZDtXuN7nsiwuh+bS1F94SOLXQPjkS5UDMpi0MoGSb7yDqRL8wL4LmrhtrunzjIPNNUi5XLornGTy93h0IClw7tgk0PT0CO32catLQad9WKqHawNScJ5fqcoi0kwj55hsk+sk7ke5Q2x5j+7UxJuiTFNkUyoumbNneMFGpT2KNhg1V0jfYaWhfN69edZn/xJKN9W+DoGobJPrL2z9pOs9sV5+PuCf1cnasgN/LA6Nc+HEUzsJMhmsaQ0NKqIIkc5GxTmKe6a64a0Q19DRWf0gVb8gyTfWStyEsmDGqPEzu3UNdz/T5MHtXT1Tma50Us+TN6t8GnvzkbF5+kL1LdaFB5u4yVT195MqbfNFJ9E3A6gzYVcHQNw2QfWSvyUjwvH9YV7/7idHV7wCJEMhbNDKl+u7dpbhJn6Z4pVtxER+r00TaS8wd1QKeSZqpPPhMGO2WoZiY9cBiG8YasC6E0ylTARwhoomO0kTJWaAdEB3VqgVVVhxwl+JLemZbNc3G4thFHYhQDF6olH/PUSeedG0ZgzfbD6e4GwzBJIGsteYl0QVw4OJzf3c0s0oGdwm4eJ9Ev/TsUoUWzHNx/4QAAsevECkhL3nF3kkbb4nyM7tc23d1gGCYJZIUlb8z9okW6Zx67dDDuv3CA7YQfbfk843mdPBiK8nOw4v5zIYRAUX4Ad5wXfXBX+uQzwV3DMEz2khUi36AtsqGIptROvxIXmOP3oU1hnuXxeQEfSovM+2QZPjdRJ0SEVQ+Mj9lODbFkjWcYJolkhbumttG+9qoTK7zAooYqEIllT0bUiWBLnmGYFJAdIq9Jp2uUTCcCbefsaUyqyIfPzRLPMEwyyQ6RrzdPPJI4seS1Ln25+NVvR6sl+5Ih8jLiJ89haT6GYZh4yAqf/LEGe3dNvAJNRAgGkyfyV59ehgM19Zg8qofn52YYhpFkhSUfTeStskoCQOeWzdRlbXTOiJ6tAYTz1STTks/P8eOu8/ubJloxDMN4SVaIvLHEHRDxdVsVAQGAaTeOxJM/OgmA3if/x+8Pwpxfn4WSglw16RjndGEYpqmSFSKvteSNemznk29TmIfh3VuZtucF/OhZGq7mpIp8HKkQGIZhMoGsEPna+vh88uoDwSa8hi15hmGaOlkh8l1aFegyTWqJFocu99mFUAaTGELJMAyTCrJC5Ad2aqHmjDHKcbSUB361AIh1m2QOvDIMw6SCrBB5wFxu77yB7QGY0wRriTXblC15hmGaOp6IPBH9mogEEbVR1omIniCiciJaSUQne3Edh30BAPx+0kAsvHuMrqqTqa3y6e2MfRZ5hmGaOgmLPBF1AXAugC2azecD6K38mwzg6USv45Ycvw9tLTJLaon45K1V/tozugMAerYp9LZzDMMwKcKLGa+PA7gDwHTNtkkAXhZhh/h8Iiohog5CiB0eXM8SGfZ4zcgyx8fEMtAvHNxRzUPPMAzTFElI5IloEoAqIcQKQ+m4TgC2ata3KdtMIk9EkxG29tG1a9e4+9KyeS4qH5no6hhShmmjjM0yDMM0aWKKPBF9AqC9xa4pAO5G2FUTN0KIqQCmAsDQoUNTKrfyucQazzBMthJT5IUQY622E9EgAN0BSCu+M4ClRDQcQBWALprmnZVtGYX0yTfL4fwxDMNkJ3G7a4QQqwCohUGJqBLAUCHEXiKaAeAmInoDwKkADiXTHx8vuQEf7jq/H8b05/qmDMNkJ8lKNTwLwAQA5QBqAFyTpOskzPVn9Ux3FxiGYZKGZyIvhCjTLAsAN3p1boZhGCY+smbGK8MwDGOGRZ5hGCaLYZFnGIbJYljkGYZhshgWeYZhmCyGRZ5hGCaLYZFnGIbJYiha5aRUQ0R7AGyO8/A2APZ62B2vyNR+AZnbN+6XO7hf7sjGfnUTQpRa7cgokU8EIloshBia7n4YydR+AZnbN+6XO7hf7jje+sXuGoZhmCyGRZ5hGCaLySaRn5ruDtiQqf0CMrdv3C93cL/ccVz1K2t88gzDMIyZbLLkGYZhGAMs8gzDMFlMkxJ5IrqEiNYQUYiIhhr23UVE5US0gYjG2xzfnYgWKO3eJKLcJPTxTSJarvyrJKLlNu0qiWiV0m6x1/2wuN4DRFSl6dsEm3bnKfewnIjuTEG//kJE64loJRG9R0QlNu1Scr9ifX4iylO+43Llt1SWrL5ortmFiD4lorXK7/8WizZnE9Ehzfd7X7L7pbl21O+Gwjyh3LOVRHRyCvrUV3MvlhPRYSK61dAmJfeMiJ4not1EtFqzrRURfUxEG5X/W9oce5XSZiMRXRVXB4QQTeYfgP4A+gL4DOFSg3L7AAArAOQhXHd2EwC/xfFvAbhcWX4GwC+S3N9HAdxns68SQJsU3rsHAPwmRhu/cu96AMhV7umAJPfrXAABZflPAP6Urvvl5PMD+D8AzyjLlwN4MwXfXQcAJyvLRQC+tejX2QDeT9Xvyc13g3CVuNkACMBpABakuH9+ADsRnjCU8nsGYBSAkwGs1mz7M4A7leU7rX73AFoBqFD+b6kst3R7/SZlyQsh1gkhNljsmgTgDSFEnRDiO4TLDg7XNqBwtfFzALyjbHoJwEXJ6qtyvUsBvJ6saySB4QDKhRAVQoh6AG8gfG+ThhDiIyFEo7I6H+Gi7+nCyeefhPBvBwj/lsYo33XSEELsEEIsVZarAawD0CmZ1/SYSQBeFmHmAyghog4pvP4YAJuEEPHOpk8IIcQXAPYbNmt/R3ZaNB7Ax0KI/UKIAwA+BnCe2+s3KZGPQicAWzXr22D+I2gN4KBGUKzaeMmZAHYJITba7BcAPiKiJUQ0OYn90HKT8rr8vM3roZP7mEx+hrDFZ0Uq7peTz6+2UX5LhxD+baUExT10EoAFFrtHENEKIppNRCekqk+I/d2k+3d1OeyNrXTds3ZCiB3K8k4A7SzaeHLfklXIO26I6BMA7S12TRFCTE91f6xw2McfIboVf4YQooqI2gL4mIjWK0/8pPQLwNMA/oDwH+QfEHYl/SyR63nRL3m/iGgKgEYAr9qcxvP71dQgokIA/wVwqxDisGH3UoTdEUeU8ZZpAHqnqGsZ+90o427fA3CXxe503jMVIYQgoqTFsmecyAshxsZxWBWALpr1zso2LfsQfk0MKBaYVRtP+khEAQDfB3BKlHNUKf/vJqL3EHYVJPSH4fTeEdG/AbxvscvJffS8X0R0NYALAIwRijPS4hye3y8LnHx+2Wab8j23QPi3lVSIKAdhgX9VCPGucb9W9IUQs4joKSJqI4RIeiIuB99NUn5XDjkfwFIhxC7jjnTeMwC7iKiDEGKH4rrabdGmCuFxA0lnhMcjXZEt7poZAC5XIh+6I/w0XqhtoIjHpwB+qGy6CkCy3gzGAlgvhNhmtZOImhNRkVxGePBxtVVbrzD4QC+2ud4iAL0pHIWUi/Br7owk9+s8AHcA+J4QosamTarul5PPPwPh3w4Q/i3NtXsweYXi838OwDohxGM2bdrLsQEiGo7w33YqHj5OvpsZAH6qRNmcBuCQxlWRbGzfqNN1zxS0vyM7LfoQwLlE1FJxr56rbHNHskeWvfyHsDhtA1AHYBeADzX7piAcGbEBwPma7bMAdFSWeyAs/uUA3gaQl6R+vgjgBsO2jgBmafqxQvm3BmG3RbLv3SsAVgFYqfzAOhj7paxPQDh6Y1OK+lWOsN9xufLvGWO/Unm/rD4/gN8j/BACgHzlt1Ou/JZ6pOAenYGwm22l5j5NAHCD/J0BuEm5NysQHsA+Pdn9ivbdGPpGAP6p3NNV0ETGJblvzREW7RaabSm/Zwg/ZHYAaFD061qEx3HmANgI4BMArZS2QwE8qzn2Z8pvrRzANfFcn9MaMAzDZDHZ4q5hGIZhLGCRZxiGyWJY5BmGYbIYFnmGYZgshkWeYRgmi2GRZxiGyWJY5BmGYbKY/wfJD1VDMNtjMQAAAABJRU5ErkJggg==\n",
+ "image/svg+xml": "\n\n\n\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "tags": [],
+ "needs_background": "light"
+ }
+ }
+ ]
},
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "8v1nIT8t1vpv",
- "outputId": "dd5b0670-8bb8-4ea5-d88b-249d6fa40586"
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([1., 1., 1., 1., 1., 1.])"
- ]
- },
- "execution_count": 63,
- "metadata": {
- "tags": []
- },
- "output_type": "execute_result"
- }
- ],
- "source": [
- "c.ravel()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "fCZw29aYqPnU"
- },
- "source": [
- "## Random normal and random uniform in Numpy\n",
- "Ever heard of normal and uniform distribution?
\n",
- "* Normal distribution is a probability distribution of a random variable, which has bell shaped curve
\n",
- "* In uniform distribution, probability of choosing any number at random is equally likely.
\n",
- "* These probability distributions are extremely useful in a broad spectrum of engineering disciplines. We will look more about this in later part of the session"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "laXxuqsJsl6Y"
- },
- "source": [
- ""
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "ExecuteTime": {
- "end_time": "2021-02-11T16:38:50.456412Z",
- "start_time": "2021-02-11T16:38:50.452001Z"
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "7z4HoJ59uc2H"
+ },
+ "source": [
+ "The plot does look messy right! We use scatter plots when we want to plot the data points without any curve to fit them"
+ ]
},
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "id": "m2iymA81rHdI",
- "outputId": "d8d31687-e96c-4fe1-c71c-85633cde455f"
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([[15.61005451, 19.44434949, 20.03029181],\n",
- " [36.1081871 , 9.12333028, 2.89515486]])"
- ]
- },
- "execution_count": 66,
- "metadata": {
- "tags": []
- },
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# Creating 2x3 array whose elements are randomly sampled from a normal distribution with mean =0 and std = 1\n",
- "np.random.randn(2,3)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "ExecuteTime": {
- "end_time": "2021-02-11T16:38:51.755201Z",
- "start_time": "2021-02-11T16:38:51.155719Z"
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "iDurC0vrtgDf",
+ "outputId": "2612e922-a996-46bb-b79a-9fde6b01f846"
+ },
+ "source": [
+ "plt.scatter(x,y,s=2);"
+ ],
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "image/png": "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\n",
+ "image/svg+xml": "\n\n\n