From 9e5638aab8872638f6a8b129519b2c6068f97cdf Mon Sep 17 00:00:00 2001
From: Mirko Birbaumer <mirko.birbaumer@hslu.ch>
Date: Sat, 17 Sep 2022 11:08:28 +0000
Subject: [PATCH] added matrix operation chapter

---
 ...book - Introduction Numpy and Pandas.ipynb | 547 ++++++++++++------
 1 file changed, 371 insertions(+), 176 deletions(-)

diff --git a/notebooks/Preliminaries_Numpy_Pandas/Jupyter Notebook - Introduction Numpy and Pandas.ipynb b/notebooks/Preliminaries_Numpy_Pandas/Jupyter Notebook - Introduction Numpy and Pandas.ipynb
index 2a16323..1fc3c5d 100644
--- a/notebooks/Preliminaries_Numpy_Pandas/Jupyter Notebook - Introduction Numpy and Pandas.ipynb	
+++ b/notebooks/Preliminaries_Numpy_Pandas/Jupyter Notebook - Introduction Numpy and Pandas.ipynb	
@@ -6,12 +6,12 @@
    "source": [
     "## Functions, Conditionals, and Iteration in Python\n",
     "\n",
-    "Let us create a Python function, and call it from a loop."
+    "Let us create a Python function, and call it."
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 42,
+   "execution_count": 182,
    "metadata": {},
    "outputs": [
     {
@@ -45,7 +45,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 43,
+   "execution_count": 183,
    "metadata": {},
    "outputs": [
     {
@@ -87,7 +87,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 44,
+   "execution_count": 184,
    "metadata": {},
    "outputs": [
     {
@@ -115,7 +115,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 45,
+   "execution_count": 185,
    "metadata": {},
    "outputs": [
     {
@@ -171,7 +171,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 46,
+   "execution_count": 186,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -221,7 +221,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 47,
+   "execution_count": 187,
    "metadata": {},
    "outputs": [
     {
@@ -230,7 +230,7 @@
        "array(5)"
       ]
      },
-     "execution_count": 47,
+     "execution_count": 187,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -252,7 +252,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 48,
+   "execution_count": 188,
    "metadata": {},
    "outputs": [
     {
@@ -261,7 +261,7 @@
        "0"
       ]
      },
-     "execution_count": 48,
+     "execution_count": 188,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -280,7 +280,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 49,
+   "execution_count": 189,
    "metadata": {},
    "outputs": [
     {
@@ -289,7 +289,7 @@
        "()"
       ]
      },
-     "execution_count": 49,
+     "execution_count": 189,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -311,7 +311,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 50,
+   "execution_count": 190,
    "metadata": {},
    "outputs": [
     {
@@ -320,7 +320,7 @@
        "numpy.int64"
       ]
      },
-     "execution_count": 50,
+     "execution_count": 190,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -355,7 +355,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 51,
+   "execution_count": 191,
    "metadata": {},
    "outputs": [
     {
@@ -364,7 +364,7 @@
        "array([1, 2, 3])"
       ]
      },
-     "execution_count": 51,
+     "execution_count": 191,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -384,7 +384,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 52,
+   "execution_count": 192,
    "metadata": {},
    "outputs": [
     {
@@ -393,7 +393,7 @@
        "(3,)"
       ]
      },
-     "execution_count": 52,
+     "execution_count": 192,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -411,7 +411,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 53,
+   "execution_count": 193,
    "metadata": {},
    "outputs": [
     {
@@ -420,7 +420,7 @@
        "1"
       ]
      },
-     "execution_count": 53,
+     "execution_count": 193,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -442,7 +442,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 54,
+   "execution_count": 194,
    "metadata": {},
    "outputs": [
     {
@@ -451,7 +451,7 @@
        "2"
       ]
      },
-     "execution_count": 54,
+     "execution_count": 194,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -470,7 +470,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 55,
+   "execution_count": 195,
    "metadata": {},
    "outputs": [
     {
@@ -479,7 +479,7 @@
        "array([2, 3])"
       ]
      },
-     "execution_count": 55,
+     "execution_count": 195,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -511,7 +511,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 56,
+   "execution_count": 196,
    "metadata": {},
    "outputs": [
     {
@@ -522,7 +522,7 @@
        "       [7, 8, 9]])"
       ]
      },
-     "execution_count": 56,
+     "execution_count": 196,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -542,7 +542,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 57,
+   "execution_count": 197,
    "metadata": {},
    "outputs": [
     {
@@ -551,7 +551,7 @@
        "2"
       ]
      },
-     "execution_count": 57,
+     "execution_count": 197,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -569,7 +569,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 58,
+   "execution_count": 198,
    "metadata": {},
    "outputs": [
     {
@@ -578,7 +578,7 @@
        "(3, 3)"
       ]
      },
-     "execution_count": 58,
+     "execution_count": 198,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -597,7 +597,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 59,
+   "execution_count": 199,
    "metadata": {},
    "outputs": [
     {
@@ -606,7 +606,7 @@
        "6"
       ]
      },
-     "execution_count": 59,
+     "execution_count": 199,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -627,7 +627,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 60,
+   "execution_count": 200,
    "metadata": {},
    "outputs": [
     {
@@ -663,7 +663,7 @@
        "         [17]]]])"
       ]
      },
-     "execution_count": 60,
+     "execution_count": 200,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -683,7 +683,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 61,
+   "execution_count": 201,
    "metadata": {},
    "outputs": [
     {
@@ -692,7 +692,7 @@
        "(3, 3, 2, 1)"
       ]
      },
-     "execution_count": 61,
+     "execution_count": 201,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -703,7 +703,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 62,
+   "execution_count": 202,
    "metadata": {},
    "outputs": [
     {
@@ -712,7 +712,7 @@
        "4"
       ]
      },
-     "execution_count": 62,
+     "execution_count": 202,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -730,7 +730,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 63,
+   "execution_count": 203,
    "metadata": {},
    "outputs": [
     {
@@ -739,7 +739,7 @@
        "16"
       ]
      },
-     "execution_count": 63,
+     "execution_count": 203,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -763,7 +763,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 64,
+   "execution_count": 204,
    "metadata": {},
    "outputs": [
     {
@@ -772,7 +772,7 @@
        "(4,)"
       ]
      },
-     "execution_count": 64,
+     "execution_count": 204,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -792,7 +792,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 65,
+   "execution_count": 205,
    "metadata": {},
    "outputs": [
     {
@@ -801,7 +801,7 @@
        "array([[1, 2, 3, 4]])"
       ]
      },
-     "execution_count": 65,
+     "execution_count": 205,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -821,7 +821,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 66,
+   "execution_count": 206,
    "metadata": {},
    "outputs": [
     {
@@ -833,7 +833,7 @@
        "       [4]])"
       ]
      },
-     "execution_count": 66,
+     "execution_count": 206,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -857,7 +857,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 67,
+   "execution_count": 207,
    "metadata": {},
    "outputs": [
     {
@@ -866,7 +866,7 @@
        "array([[1, 2, 3, 4]])"
       ]
      },
-     "execution_count": 67,
+     "execution_count": 207,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -878,7 +878,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 68,
+   "execution_count": 208,
    "metadata": {},
    "outputs": [
     {
@@ -887,7 +887,7 @@
        "(1, 4)"
       ]
      },
-     "execution_count": 68,
+     "execution_count": 208,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -898,7 +898,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 69,
+   "execution_count": 209,
    "metadata": {},
    "outputs": [
     {
@@ -910,7 +910,7 @@
        "       [4]])"
       ]
      },
-     "execution_count": 69,
+     "execution_count": 209,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -922,7 +922,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 70,
+   "execution_count": 210,
    "metadata": {},
    "outputs": [
     {
@@ -931,7 +931,7 @@
        "(4, 1)"
       ]
      },
-     "execution_count": 70,
+     "execution_count": 210,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -963,14 +963,14 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 71,
+   "execution_count": 211,
    "metadata": {},
    "outputs": [
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "0.00015544891357421875\n",
+      "0.0002567768096923828\n",
       "[6, 7, 8, 9, 10]\n"
      ]
     }
@@ -1010,14 +1010,14 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 72,
+   "execution_count": 212,
    "metadata": {},
    "outputs": [
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "0.00020384788513183594\n",
+      "0.0005545616149902344\n",
       "[ 6  7  8  9 10]\n"
      ]
     }
@@ -1041,14 +1041,14 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 73,
+   "execution_count": 213,
    "metadata": {},
    "outputs": [
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "0.00024271011352539062\n",
+      "0.00030875205993652344\n",
       "[ 6  7  8  9 10]\n"
      ]
     }
@@ -1073,7 +1073,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 74,
+   "execution_count": 214,
    "metadata": {},
    "outputs": [
     {
@@ -1082,7 +1082,7 @@
        "array([ 5, 10, 15, 20])"
       ]
      },
-     "execution_count": 74,
+     "execution_count": 214,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1094,7 +1094,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 75,
+   "execution_count": 215,
    "metadata": {},
    "outputs": [
     {
@@ -1103,7 +1103,7 @@
        "array([ 5, 10, 15, 20])"
       ]
      },
-     "execution_count": 75,
+     "execution_count": 215,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1127,7 +1127,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 76,
+   "execution_count": 216,
    "metadata": {},
    "outputs": [
     {
@@ -1138,7 +1138,7 @@
        "       [0, 0, 0]])"
       ]
      },
-     "execution_count": 76,
+     "execution_count": 216,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1169,7 +1169,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 77,
+   "execution_count": 217,
    "metadata": {},
    "outputs": [
     {
@@ -1179,7 +1179,7 @@
        "       [5, 7]])"
       ]
      },
-     "execution_count": 77,
+     "execution_count": 217,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1191,7 +1191,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 78,
+   "execution_count": 218,
    "metadata": {},
    "outputs": [
     {
@@ -1201,7 +1201,7 @@
        "       [6, 8]])"
       ]
      },
-     "execution_count": 78,
+     "execution_count": 218,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1213,7 +1213,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 79,
+   "execution_count": 219,
    "metadata": {},
    "outputs": [
     {
@@ -1223,7 +1223,7 @@
        "       [11, 15]])"
       ]
      },
-     "execution_count": 79,
+     "execution_count": 219,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1241,7 +1241,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 80,
+   "execution_count": 220,
    "metadata": {},
    "outputs": [
     {
@@ -1251,7 +1251,7 @@
        "       [5, 7]])"
       ]
      },
-     "execution_count": 80,
+     "execution_count": 220,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1263,7 +1263,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 81,
+   "execution_count": 221,
    "metadata": {},
    "outputs": [
     {
@@ -1274,7 +1274,7 @@
        "       [1, 8, 7]])"
       ]
      },
-     "execution_count": 81,
+     "execution_count": 221,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1286,7 +1286,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 82,
+   "execution_count": 222,
    "metadata": {},
    "outputs": [
     {
@@ -1295,7 +1295,7 @@
        "(2, 2)"
       ]
      },
-     "execution_count": 82,
+     "execution_count": 222,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1306,7 +1306,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 83,
+   "execution_count": 223,
    "metadata": {},
    "outputs": [
     {
@@ -1315,7 +1315,7 @@
        "(3, 3)"
       ]
      },
-     "execution_count": 83,
+     "execution_count": 223,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1326,7 +1326,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 84,
+   "execution_count": 224,
    "metadata": {},
    "outputs": [
     {
@@ -1336,7 +1336,7 @@
      "traceback": [
       "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
       "\u001b[0;31mValueError\u001b[0m                                Traceback (most recent call last)",
-      "\u001b[0;32m<ipython-input-84-e81e582b6fa9>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0ma\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mc\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+      "\u001b[0;32m<ipython-input-224-e81e582b6fa9>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0ma\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mc\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 (2,2) (3,3) "
      ]
     }
@@ -1347,7 +1347,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 85,
+   "execution_count": 225,
    "metadata": {},
    "outputs": [
     {
@@ -1357,7 +1357,7 @@
        "       [4, 5, 6]])"
       ]
      },
-     "execution_count": 85,
+     "execution_count": 225,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1369,7 +1369,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 86,
+   "execution_count": 226,
    "metadata": {},
    "outputs": [
     {
@@ -1379,7 +1379,7 @@
        "       [1.  , 1.25, 1.5 ]])"
       ]
      },
-     "execution_count": 86,
+     "execution_count": 226,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1391,7 +1391,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 87,
+   "execution_count": 227,
    "metadata": {},
    "outputs": [
     {
@@ -1401,7 +1401,7 @@
        "       [4.  , 6.25, 9.  ]])"
       ]
      },
-     "execution_count": 87,
+     "execution_count": 227,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1412,7 +1412,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 88,
+   "execution_count": 228,
    "metadata": {},
    "outputs": [
     {
@@ -1422,7 +1422,7 @@
        "       [4.  , 6.25, 9.  ]])"
       ]
      },
-     "execution_count": 88,
+     "execution_count": 228,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1442,7 +1442,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 89,
+   "execution_count": 229,
    "metadata": {},
    "outputs": [
     {
@@ -1452,7 +1452,7 @@
        "       [5, 6, 7, 8]])"
       ]
      },
-     "execution_count": 89,
+     "execution_count": 229,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1464,7 +1464,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 90,
+   "execution_count": 230,
    "metadata": {},
    "outputs": [
     {
@@ -1473,7 +1473,7 @@
        "(2, 4)"
       ]
      },
-     "execution_count": 90,
+     "execution_count": 230,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1484,7 +1484,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 91,
+   "execution_count": 231,
    "metadata": {},
    "outputs": [
     {
@@ -1496,7 +1496,7 @@
        "       [10, 11, 12]])"
       ]
      },
-     "execution_count": 91,
+     "execution_count": 231,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1508,7 +1508,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 92,
+   "execution_count": 232,
    "metadata": {},
    "outputs": [
     {
@@ -1517,7 +1517,7 @@
        "(4, 3)"
       ]
      },
-     "execution_count": 92,
+     "execution_count": 232,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1528,7 +1528,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 93,
+   "execution_count": 233,
    "metadata": {},
    "outputs": [
     {
@@ -1538,7 +1538,7 @@
        "       [158, 184, 210]])"
       ]
      },
-     "execution_count": 93,
+     "execution_count": 233,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1550,7 +1550,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 94,
+   "execution_count": 234,
    "metadata": {},
    "outputs": [
     {
@@ -1559,7 +1559,7 @@
        "(2, 3)"
       ]
      },
-     "execution_count": 94,
+     "execution_count": 234,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1577,7 +1577,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 95,
+   "execution_count": 235,
    "metadata": {},
    "outputs": [
     {
@@ -1587,7 +1587,7 @@
      "traceback": [
       "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
       "\u001b[0;31mValueError\u001b[0m                                Traceback (most recent call last)",
-      "\u001b[0;32m<ipython-input-95-af3b88aa2232>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmatmul\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mb\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+      "\u001b[0;32m<ipython-input-235-af3b88aa2232>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmatmul\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mb\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0ma\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: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 2 is different from 3)"
      ]
     }
@@ -1610,7 +1610,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 96,
+   "execution_count": 236,
    "metadata": {},
    "outputs": [
     {
@@ -1620,7 +1620,7 @@
        "       [3, 4]])"
       ]
      },
-     "execution_count": 96,
+     "execution_count": 236,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1632,7 +1632,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 97,
+   "execution_count": 237,
    "metadata": {},
    "outputs": [
     {
@@ -1642,7 +1642,7 @@
        "       [15, 22]])"
       ]
      },
-     "execution_count": 97,
+     "execution_count": 237,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1653,7 +1653,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 98,
+   "execution_count": 238,
    "metadata": {},
    "outputs": [
     {
@@ -1663,7 +1663,7 @@
        "       [15, 22]])"
       ]
      },
-     "execution_count": 98,
+     "execution_count": 238,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1674,7 +1674,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 99,
+   "execution_count": 239,
    "metadata": {},
    "outputs": [
     {
@@ -1684,7 +1684,7 @@
        "       [15, 22]])"
       ]
      },
-     "execution_count": 99,
+     "execution_count": 239,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1715,7 +1715,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 100,
+   "execution_count": 240,
    "metadata": {},
    "outputs": [
     {
@@ -1726,7 +1726,7 @@
        "       [ 9, 10, 11, 12]])"
       ]
      },
-     "execution_count": 100,
+     "execution_count": 240,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1738,7 +1738,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 101,
+   "execution_count": 241,
    "metadata": {},
    "outputs": [
     {
@@ -1750,7 +1750,7 @@
        "       [ 4,  8, 12]])"
       ]
      },
-     "execution_count": 101,
+     "execution_count": 241,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1775,7 +1775,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 102,
+   "execution_count": 242,
    "metadata": {},
    "outputs": [
     {
@@ -1787,7 +1787,7 @@
        "       [  4, 200,  12]])"
       ]
      },
-     "execution_count": 102,
+     "execution_count": 242,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1800,7 +1800,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 103,
+   "execution_count": 243,
    "metadata": {},
    "outputs": [
     {
@@ -1811,7 +1811,7 @@
        "       [  9,  10,  11,  12]])"
       ]
      },
-     "execution_count": 103,
+     "execution_count": 243,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1841,96 +1841,291 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "The following example will show what matrices and vectors are good for. \n",
+    "For means of simple demonstration how matrix operations can be interpreted geometrically we will apply a couple of transformations to manipulate the $x$ and $y$ coordinates of the following points which have three dimensional components of $x$, $y$ and ascii character index similar to the way an image pixel has 3 dimensional components of $x$, $y$, and frequency (or intensity).\n",
     "\n",
-    "We are going to start with a picture of a bug."
+    "$$\n",
+    "\\begin{align}\n",
+    "a & = (0, 1, 0) \\\\\n",
+    "b & = (1, 0, 1) \\\\\n",
+    "c & = (0, -1, 2) \\\\\n",
+    "d & = (-1, 0, 3)\n",
+    "\\end{align}\n",
+    "$$\n",
+    "\n",
+    "The transformations for this example will be Scaling by $2$ in all directions and rotation of $90$ degrees clockwise. First we will perform the transformations individually to show the direct effect each has on moving the points around then we will combine the transformations and apply them in one action.\n",
+    "\n",
+    "To begin we want to build a Numpy array (some may call this a matrix) with each row representing the point where the first column is the $x$, the second the $y$, and the third is the index of its letter in the ascii character set similar to the table shown below. Next we use Matplotlib to plot the points - after applying the unchanging _Identity transformation_\n",
+    "\n",
+    "$$I=\n",
+    "\\left(\\begin{array}{rrr} \n",
+    "1 & 0 & 0 \\\\ \n",
+    "0 & 1 & 0 \\\\ \n",
+    "0 & 0 & 1 \\\\ \n",
+    "\\end{array}\\right)\n",
+    "$$\n",
+    "\n",
+    "\n",
+    "\n",
+    "to give a baseline visual of where we stand."
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 104,
+   "execution_count": 283,
    "metadata": {},
    "outputs": [
     {
-     "ename": "FileNotFoundError",
-     "evalue": "[Errno 2] No such file or directory: 'stinkbug4.JPG'",
-     "output_type": "error",
-     "traceback": [
-      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
-      "\u001b[0;31mFileNotFoundError\u001b[0m                         Traceback (most recent call last)",
-      "\u001b[0;32m<ipython-input-104-3d285766ff57>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      4\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mmatplotlib\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpyplot\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      5\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mmatplotlib\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mimage\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mmpimg\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0mimg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmpimg\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mimread\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'stinkbug4.JPG'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      7\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mimshow\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m/opt/conda/lib/python3.7/site-packages/matplotlib/image.py\u001b[0m in \u001b[0;36mimread\u001b[0;34m(fname, format)\u001b[0m\n\u001b[1;32m   1484\u001b[0m                     \u001b[0mresponse\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mio\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mBytesIO\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresponse\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1485\u001b[0m                 \u001b[0;32mreturn\u001b[0m \u001b[0mimread\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresponse\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mformat\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mext\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1486\u001b[0;31m     \u001b[0;32mwith\u001b[0m \u001b[0mimg_open\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfname\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mimage\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1487\u001b[0m         return (_pil_png_to_float_array(image)\n\u001b[1;32m   1488\u001b[0m                 \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimage\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mPIL\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mPngImagePlugin\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mPngImageFile\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m/opt/conda/lib/python3.7/site-packages/PIL/Image.py\u001b[0m in \u001b[0;36mopen\u001b[0;34m(fp, mode, formats)\u001b[0m\n\u001b[1;32m   2889\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2890\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0mfilename\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2891\u001b[0;31m         \u001b[0mfp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mbuiltins\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilename\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"rb\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   2892\u001b[0m         \u001b[0mexclusive_fp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2893\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: 'stinkbug4.JPG'"
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "[[ 0  1  0]\n",
+      " [ 1  0  1]\n",
+      " [ 0 -1  2]\n",
+      " [-1  0  3]]\n",
+      "[[1. 0. 0.]\n",
+      " [0. 1. 0.]\n",
+      " [0. 0. 1.]]\n"
      ]
     }
    ],
    "source": [
-    "%matplotlib inline \n",
-    "\n",
-    "import numpy as np\n",
     "import matplotlib.pyplot as plt\n",
-    "import matplotlib.image as mpimg\n",
-    "img = mpimg.imread('stinkbug4.JPG')\n",
-    "plt.imshow(img)"
+    "import numpy as np\n",
+    "import string\n",
+    "\n",
+    "# points a, b and, c\n",
+    "a, b, c, d = (0, 1, 0), (1, 0, 1), (0, -1, 2), (-1, 0, 3)\n",
+    "\n",
+    "# matrix with row vectors of points\n",
+    "A = np.array([a, b, c, d])\n",
+    "print(A)\n",
+    "\n",
+    "# 3x3 Identity transformation matrix\n",
+    "I = np.eye(3)\n",
+    "print(I)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 284,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYQAAAD8CAYAAAB3u9PLAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/d3fzzAAAACXBIWXMAAAsTAAALEwEAmpwYAAAmP0lEQVR4nO3de3RV9Z338fc34RrDPTEkgEQrAQEBBZSOIqa1FpVqL7SFIq29TOx0bOd5Zvp0bO3qdDrjms7TrlmjVdq6aNe0Txk0tuiI0jpeAsIUFIKgQAARUUHUyk1iQsLJ+T5/nJ0YaG7k7HP2Dvm81jore5/zO/v3yU5yvtm33zZ3R0REJCfqACIiEg8qCCIiAqggiIhIQAVBREQAFQQREQmoIIiICBBCQTCzMWZWZWY7zGy7mf1NG22uNrNjZrYleHwv3X5FRCRcfUJYRgL4O3ffbGaDgGoze8Ldd5zWbq27zwuhPxERyYC0txDc/aC7bw6mjwM1wKh0lysiItkVxhZCCzMrBS4Bnm3j5Q+a2VbgDeCb7r69nWVUABUAAwYMmH7eeeeFGfGMJZNJcnKiP9QShxzKEK8cccgQlxxxyBCXHLt3737H3Qu79WZ3D+UB5APVwCfbeG0wkB9MXw+81JVllpWVedSqqqqijuDu8cihDO+LQ444ZHCPR444ZHCPRw5gk3fzczyUUmZmfYHfAcvcfUUbReddd68NplcBfc2sIIy+RUQkHGGcZWTAL4Aad/+3dtqMDNphZpcF/R5Kt28REQlPGMcQrgAWAy+a2Zbgue8A5wG4+8+A+cBfmVkCqAcWBJs2IiISE2kXBHdfB1gnbe4B7km3LxERyZzoD8uLiEgsqCCIiAiggiAiIgEVBBERAVQQREQkoIIgIiKACoKIiARUEEREBFBBEBGRgAqCiIgAKggiIhJQQRAREUAFQUREAmHcD2GMmVWZ2Q4z225mf9NGGzOzu81sj5m9YGaXptuviIiEK4z7ISSAv3P3zWY2CKg2syfcfUerNtcB44LH5cBPg68iIhITaW8huPtBd98cTB8HaoBRpzW7Cfh1cMvPDcBQMytOt28REQmPhXnjMjMrBZ4BJrv7u62efxT4YXAzHczsKeDv3X1TG8uoACoACgsLp1dWVoaWrztqa2vJz8+PNENccihDvHLEIUNccsQhQ1xylJeXV7v7jG692d1DeQD5QDXwyTZeexS4stX8U8CMzpZZVlbmUauqqoo6grvHI4cyvC8OOeKQwT0eOeKQwT0eOYBN3s3P8VDOMjKzvsDvgGXuvqKNJgeAMa3mRwfPiYhITIRxlpEBvwBq3P3f2mn2CPD54GyjWcAxdz+Ybt8iIhKeMM4yugJYDLxoZluC574DnAfg7j8DVgHXA3uAOuCLIfQrIiIhSrsgeOpAsXXSxoG/TrcvERHJHF2pLCIigAqCiIgEVBBERARQQRARkYAKgoiIACoIIiISUEEQERFABUFERAIqCCIiAqggiIhIQAVBREQAFQQREQmoIIiICBBSQTCzX5rZ22a2rZ3XrzazY2a2JXh8L4x+RUQkPGHcDwHgP4B7gF930Gatu88LqT8REQlZKFsI7v4McDiMZYmISDQsde+aEBZkVgo86u6T23jtalL3XN4PvAF80923t7OcCqACoLCwcHplZWUo+bqrtraW/Pz8SDPEJYcyxCtHHDLEJUccMsQlR3l5ebW7z+jWm909lAdQCmxr57XBQH4wfT3wUleWWVZW5lGrqqqKOoK7xyOHMrwvDjnikME9HjnikME9HjmATd7Nz/GsnGXk7u+6e20wvQroa2YF2ehbRES6JisFwcxGmpkF05cF/R7KRt8iItI1oZxlZGbLgauBAjPbD/wD0BfA3X8GzAf+yswSQD2wINi0ERGRmAilILj7wk5ev4fUaakiIhJTulJZREQAFQQREQmoIIiICKCCICIiARUEEREBVBBERCSggiAiIoAKgoiIBFQQREQEUEEQEZGACoJIFnz84x9n+vTpTJo0ifvuuy/qOCJtCusWmiLSgV/+8pcMHz6c+vp6Zs6cyac+9SlGjBgRdSyRU4SyhWBmvzSzt81sWzuvm5ndbWZ7zOwFM7s0jH5Feoq7776bqVOnMmvWLF5//XVeeumlqCOJ/Jmwdhn9BzC3g9evA8YFjwrgpyH1K5Jdy5ZBaSlUV6e+LlvW6VtWr17Nk08+yfr169m6dSuXXHIJJ06cyHhUkTMVSkFw92eAwx00uQn4dXCHtw3AUDMrDqNvkaxZtgwqKvBXX03dGvbVV6GiotOicOzYMYYNG0ZeXh47d+5kw4YNWQoscmaydVB5FPB6q/n9wXMiPccdd/DKuedyz9e/zsa6Ovaefz7U1cEdd3T4trlz55JIJLjooou4/fbbmTVrVpYCi5wZC+vGZWZWCjzq7pPbeO1R4Ifuvi6Yfwr4e3ff1EbbClK7lSgsLJxeWVkZSr7uqq2tJT8/P9IMccnR6zNUV3MimWRLfT1NOTlM6dePQbm5qdemT896nDj8POKSIw4Z4pKjvLy82t1ndOvN7h7KAygFtrXz2s+Bha3mdwHFnS2zrKzMo1ZVVRV1BHePR47emqG6utofe+wx97Fj3cEd/Okf/ahleu28eb5ly5as54rDz8M9HjnikME9HjmATd7Nz/Fs7TJ6BPh8cLbRLOCYux/MUt8iaTl69CjvvPMOiX/6J8jLA8DMAEiecw57rrySffv2RZhQJByhXIdgZsuBq4ECM9sP/APQF8DdfwasAq4H9gB1wBfD6FckE5LJJBs2bKC0tJSSkhLmzJlDTk5Oqgjk5Lx/zGDsWHLuvJPPL1xIU1MTAEeOHGHPnj3MmDGjpWiI9BShFAR3X9jJ6w78dRh9iWRaY2MjGzZsoLa2lpKSEnKbjxMALFqUeqxeDcFWQQ6Qk5Pa2H7++ed59tlnmTBhAoMGDcp6dpF06EplESCRSPDCCy9wySWXMGDAAP7yL/+yWwcHy8vLmTp1aksx2LlzJ+PGjTu1qIjElMYyEgFqampYuXIlr7zyCgCDBg3q1i4fM2sZkuLAgQM88MADbN68OdSsIpmiLQTptRobGzly5AhFRUVMnjyZIUOGcN5554W2/FGjRvG5z32OCy64AEgdXxg0aBB9+ujPTuJJWwjSa61YsYJly5aRSCQws1CLQbPm3UXJZJLly5ezfPny0PsQCYv+VZFe5cSJE/Tp04c+ffowZ84cGhoasvIfe05ODh/96EdbdkO5OydPnqRfv34Z71ukq7SFIL1GfX09S5Ys4ZlnngGguLiY0tLSrPX/gQ98oGX30aZNm1iyZAnvvvtu1voX6YwKgpz1kskkAAMHDmT69OlMmDAh4kQwcuRIxo0b13I2koc0hIxIOlQQ5Ky2d+9e7r77bo4ePQrAnDlzKCkpiTYUMGbMGG644QbMjPr6eu677z5efvnlqGNJL6eCIGe14cOHM2LEiJathDiqr68nNzeXc845J+oo0svpoLKcdaqrq3nzzTe54YYbGDp0KIsXL446UoeGDx/Ol7/85ZYDzmvXrmXQoEFMmzYt2mDS62gLQc467777LocPHyaRSEQdpctaBstLJtm7dy+vvfZaxImkN9IWgvR4yWSS9evXU1payqhRo5gzZw5m1iMHl8vJyeHzn/98SzE7cuQIL730EjNnzuyR34/0LNpCkB6vsbGRZ599lh07dgC8PzJpD2Vm9O3bF0gNlvf0009TW1sbcSrpDUIpCGY218x2mdkeM7u9jddvMbM/mdmW4PGVMPqV3iuRSFBdXY27M2DAACoqKrjmmmuijhW68vJyKioqWk5PrampaRlqWyRsaRcEM8sF7gWuAyYCC81sYhtNH3D3acFjabr9Su9WU1PDo48+2nJjmvz8/B69VdAeM2P48OEAvPHGG1RWVmqwPMmYMI4hXAbscfe9AGZ2P3ATsCOEZYu0aGxsbNl1MnnyZIYOHcqYMWMiTpU9JSUlLFq0iPPPPx9Ina568uTJlt1LIumydK+QNLP5wFx3/0owvxi43N1va9XmFuBfgD8Bu4H/7e6vt7O8CqACoLCwcHplZWVa+dIVh5tmxyVH1Bm2bdvGu+++y6xZs1puSBOVqNeFu/Pcc88xYMAApk6dGlkOiH5dxCVDXHKUl5dXu/uMbr25uzdjbn4A84GlreYXA/ec1mYE0D+YvhV4uivLLisrC+GW0+mJw02z3eORI4oMdXV1fvLkSXd3P3jwoD/88MNZz9CWOPw8VqxY4Xv37nV392Qy6SdOnIgkRxzWRRwyuMcjB7DJu/l5Hsa/WQeA1tvto4PnWhedQ+7eEMwuBaaH0K+c5erq6liyZAlr1qwBUuP/DBkyJOJU8TFs2LCW3UcbN27UYHmStjAKwkZgnJmdb2b9gAXAI60bmFlxq9kbgZoQ+pWzVPNZNHl5ecycOZOJE9s6R0FaKykpoaysTIPlSVrSLgjungBuAx4n9UFf6e7bzewHZnZj0OwbZrbdzLYC3wBuSbdfOTvt3buXn/zkJy2D0V111VUUFxd3/CZh9OjRpwyW9/Of/1yD5ckZC+VKZXdfBaw67bnvtZr+NvDtMPqSs9uIESMoKCiI9WB0cVdfX0/fvn01WJ6cMQ1dIZHbtGkTb775JvPmzWPIkCHcfPPNUUfq0YYPH86XvvSllusynnnmGfLz87n00ksjTiZxp6ErJHLHjx/n6NGjPWowurhrPVjevn372L9/f8SJpCfQFoJkXVNTE3/84x+54IILevxgdHGXk5PD4sWLW4rt4cOH2b17N5dddlnk13JI/Og3QrIukUiwceNGampSJ5v19MHo4q71YHlbt25l9erVvPfeexGnkjjSFoJkRSKRYMuWLUyfPp3+/ftz66236qBnBK6++mqmTZvWcnrqjh07GD9+PLm5uREnkzjQFoJkRU1NDY899ljLYHQqBtEwM4YNGwbAgQMHePDBBzVYnrTQFoJkTENDA4cPH6a4uJjJkyczbNgwRo8eHXUsCYwaNYqbb76Z0tJSIHV8YdCgQRosrxfTFoJkzIoVK1i+fDmJRAIzUzGIoQ984APk5uaSTCa5//77Wb58edSRJELaQpBQNV8U1adPH8rLyzl58iR9+ujXLO5ycnK47rrrWubdncbGRvr37x9hKsk2bSFIaOrq6rj33ntPGYyu+X4F3//+9/nxj38cZTzpxPnnn5/xwfL27dvH5MmTQ12mhEf/uknampqayM3NJS8vj8svv5xx48ZFHUnSNGrUKCZMmHDKYHk6Nfjspy0EScvLL7/MXXfdxZEjRwCYPXs2I0eOBODOO++krKyMK6+8kl27dkUZU87QqFGjuO666zAz6urq+OlPf8qePXtCWXYikWDRokVcdNFFzJ8/n7q6ulCWK+lTQZC0FBQUtBSA1qqrq7n//vvZsmULq1atYuPGjRGkkzA0NDQwYMCA0O4EtmvXLr72ta9RU1PD4MGDWbJkSSjLlfSFUhDMbK6Z7TKzPWZ2exuv9zezB4LXnzWz0jD6lexY9tZblK5fT3VtLaXr17PkqadYuXIlAEOGDOFzn/tcy7ntzdauXcsnPvEJ8vLyGDx4MDfeeGNbi5YeYNiwYXzxi19sKfxr1qyhurqaZS8uo/TfS6k+WE3pv5ey7MVlXVremDFjuOKKKwC4+eabWbduXcayy5lJ+xiCmeUC9wIfAfYDG83sEXff0arZl4Ej7n6hmS0A/hX4bLp9S+Yte+stKnbtoi4YjvrVhgYe3r+fjzQ1cV0ioTOIeonWg+W99tprvJN8h+8e+C51J+ugCF499ioVKysAWHTxoi4tq715iU4YWwiXAXvcfa+7NwL3Azed1uYm4FfB9G+BD5t+C3qEO/bupS6Z5OK33qLx7bfJTSZ58rzzuHfChA6LwVVXXcXDDz9MfX09x48fb9mikJ4tJyeHm2++mXsO30PjyUYmMYlEbWrgvLqTddzx1B2dLuO1115j/fr1APznf/4nV155ZUYzS9dZurfaM7P5wFx3/0owvxi43N1va9VmW9BmfzD/ctDmnTaWVwFUABQWFk6vrKxMK1+6amtrQ9t32hNzVNfWAtD45ps0HjjAOVOnYkEhmN5Jnt/85jc8/vjjDB06lHPPPZeysjI++9n0Ngx7+88jLhmqD1bTdKKJ+tfqKSop4r389wfLm17c/i3T33zzTb71rW8xfvx4du/ezdixY/nOd77DgAED0soTh59HXHKUl5dXu/uM7rw3dtv77n4fcB/A+PHj/eqrr440z+rVq4k6Q5Q5blm/nlcbGuDCC/nRiBH8n6FDwZ1r//Qnvn7ttfTr16/d92Yib2//eUSdoaGhgX379vGTLT/h1WOvMpShfDf/u3xz9zcBGDtkLPsW7utwGQsWLAg9Vxx+HnHK0V1h7DI6AIxpNT86eK7NNmbWBxgCHAqhb8mwOy+4gLxg3HwLxrgZd/w4f1FTw44dOzp6q5yF1qxZw4MPPsg//sU/ktc3j6McbXktr28ed374zujCSdrC2ELYCIwzs/NJffAvAD53WptHgC8A64H5wNOe7r4qyYpFRUVA6lgCtbWM7d+ff7j8cspnzKC4uBiAgwcPMmzYsLQ3+yWe6urqSCQSDB48mNmzZzNx4kRGjx5Nn4F9Wo4ZjB0yljs/fGenB5Ql3tIuCO6eMLPbgMeBXOCX7r7dzH4AbHL3R4BfAP/PzPYAh0kVDekhFhUVsaioiNWrV7Pvgx885bWmpiYeeOABCgoKdC/ks1AymWTp0qWMGDGCRYsWMXDgwJZBChddvIhFFy9K/V50sptIeoZQjiG4+ypg1WnPfa/V9Ang02H0JfGSm5vLZz7zmZZTBxOJBA0NDbrfQQ9XX1/PwIEDycnJ4SMf+QjDhw+POpJkga5UlrSVlJS07D5at24d9957L7XB2UnS87zxxhvcdddd7N69G4CLLrqIomDXoZzdYneWkfRskyZNIjc3t+XUu+aB7yT+mgewKyoqYtKkSRQUFEQdSbJMWwgSqsLCQmbPng3AsWPHTvlPU+Lr+eefZ+nSpSQSCXJzc/nYxz6m3US9kAqCZFRJSQmFhYVRx5BO5Ofnk5+fT2NjY9RRJELaZSQZM2TIkFMuQnrssccYPnw4HzztTCXJvmQyydq1a8nPz2f69OmMGzdO97EQFQTJjqamJmpra3WtQkyYGa+99tqfjVIrvZsKgmRF8+mpzdcjHjx4kJqaGq666iqNmJolJ0+eZN26dcyaNYuBAweycOFCrXs5hY4hSNaYGTnBMBi7d+/m+eef5+TJkxGn6j0OHTrEunXrWg7yqxjI6fQbIZGYM2cOM2fOZODAgbg7GzduZNq0aR0Olidn7sSJE7zyyitcdNFFjBw5kq9//esMHTo06lgSU9pCkMjk5eUBsH//fn7/+99rsLwMWLNmDb/73e84fvw4gIqBdEhbCBK5MWPGUFFR0XKLxoMHDzJ06FAGDhwYcbKe6b333qOpqYnBgwczZ84cJk+ezKBBg6KOJT2AthAkFoqLizGzlsHyfvvb30YdqUdKJpP84he/aLlD3YABAxg1alTEqaSn0BaCxEpubi6f/exnTxks78SJE5HfhSruWg9Gd+211+oqY+mWtLYQzGy4mT1hZi8FX9s8qdnMmsxsS/B4JJ0+5exXXFzcsvto3bp1LFmyRIPldaB5MLpdu3YBMGHCBM4999yIU0lPlO4Wwu3AU+7+QzO7PZj/+zba1bv7tDT7kl5o8uTJ9OnTp2ULIZlMRpwoPpqv6SgqKmLy5MkqApK2dI8h3AT8Kpj+FfDxNJcncoqCggKuvPJKAI4ePcqzzz7b8p9wb7Z582aef/75lsHo5s2bp6uOJW2Wzp0szeyouw8Npg040jx/WrsEsAVIAD9094c7WGYFUAFQWFg4vbKystv5wlBbWxuL/ddxyBF1hoaGBnbu3Mn48eMjHwIj6nVx6NAhXn/9dSZNmkTf4F7XUYl6XcQlQ1xylJeXV7v7jG692d07fABPAtvaeNwEHD2t7ZF2ljEq+HoBsA/4QGf9ujtlZWUetaqqqqgjuHs8csQtw8qVK33dunWR58iGpqYmr6qq8k2bNkWWoT1xyBGHDO7xyEHq1sWdfr629ej0GIK7X9Pea2b2lpkVu/tBMysG3m5nGQeCr3vNbDVwCfByF+qVSJuampqoq6vrNdcqmBn79+/XhWWSUekeQ3gE+EIw/QXgv05vYGbDzKx/MF0AXAHoklRJS/NgeeXl5UDqTJunnnqKRCIRcbLwNDY28vTTT1NfX4+ZsWDBAubNmxd1LDmLpVsQfgh8xMxeAq4J5jGzGWa2NGhzEbDJzLYCVaSOIaggSCiaB8vbs2cPW7duPasKwpEjR/if//kfDUYnWZPWb5i7HwI+3Mbzm4CvBNN/BC5Opx+Rzlx11VXMnDmTAQMG4O4899xzTJs2jf79+0cd7YycOHGCvXv3MnHiRIqKivjGN77BkCFDoo4lvYSGrpCzRvPxhP379/OHP/yBmpqaiBOduTVr1rBixYqWwehUDCSbtA0qZ50xY8Zw6623UlRUBKSOLwwbNiy2B6Dfe+89EokEQ4YMYc6cOVx88cUajE4ioS0EOSuNHDkSMyOZTFJZWRnbwfKaB6N79NFHgdRgdCUlJRGnkt5KWwhyVsvJyWHBggUt84lEgvr6+sj/A6+rqyMvL4+cnBw++tGPajA6iQVtIchZb+TIkS2D5a1duzbywfJOH4xu/PjxFBYWRpZHpJm2EKRXufjii+nXr1/L8AKJRCJrp3Mmk0lycnIoKipiypQpGoxOYkdbCNKrFBQUcMUVVwCpwfLuuusudu7cmfF+N2/ezNKlS1sGo7vhhhs0GJ3EjgqC9Fo5OTmMGTOmZXdSJg0ePJghQ4Zw8uTJjPcl0l3aZSS91uDBg/nMZz7TMr9y5UqGDRvWMtx2OpLJJKtXr2bw4MHMmDGDCy+8kAsvvDDt5YpkkgqCCKkP8IaGBhobG0NZnpnxxhtvUF9fH8ryRLJBu4xESO0+mj9//imD5T3xxBNntIunsbGRJ598krq6OsyMhQsXcsMNNwDw61//milTpjB16lQWL16cke9BJF3aQhBpJXWfJ3j55Zd58cUXmT17dpdvQHPkyBE2bNjAueeey5QpU8jNzQVg+/bt/PM//zN//OMfKSgo4PDhwxnLL5KOtLYQzOzTZrbdzJJm1u4desxsrpntMrM9wb2XRWJt9uzZfO1rX2sZLG/Dhg00NDT8Wbv6+np27EgN3ts8GN2UKVNOafP000/z6U9/moKCAgBdhCaxle4uo23AJ4Fn2mtgZrnAvcB1wERgoZlNTLNfkYxrvk3ngQMHePzxx6mpqWHZMigtherq1Nf77nvmlMHoBg8eHF1gkTSlVRDcvcbdO7vj+WXAHnff6+6NwP2kbr8p0iOMHj2ar371q2zbNpWKCsjNfZlk8j1efRW+//05lJR8ucOhMD70oQ/x4IMPcujQIQDtMpLYysZB5VHA663m9wfPifQYRUVFfPe7xokTSW68cSUNDak7wB49OoAf/KC4w/dOmjSJO+64gzlz5jB16lT+9m//NhuRRc6Ype7J3EEDsyeBtq7cucPd/ytosxr4ZnBjnNPfPx+Y6+5fCeYXA5e7+23t9FcBVAAUFhZOr6ys7Pp3kwG1tbUtwxz09hy9PUN1deprMlnHyJH1vP32iJbXpk/Pfp44/DzikiMOGeKSo7y8vNrd2z2m2yF3T/sBrAZmtPPaB4HHW81/G/h2V5ZbVlbmUauqqoo6grvHI0dvzzB2rDukHj/+cVXL9Nix0eSJw8/DPR454pDBPR45gE3ezc/ybOwy2giMM7PzzawfsAB4JAv9ioTqzjshL+/U5/LyUs+LnA3SPe30E2a2n9RWwGNm9njwfImZrQJw9wRwG/A4UANUuvv29GKLZN+iRXDffTB2bGp+7NjU/KJF0eYSCUtaF6a5+0PAQ208/wZwfav5VcCqdPoSiYNFi1KP1ath376o04iES0NXiIgIoIIgIiIBFQQREQFUEEREJKCCICIigAqCiIgEVBBERARQQRARkYAKgoiIACoIIiISUEEQERFABUFERAIqCCIiAqQ//PWnzWy7mSXNrN079JjZPjN70cy2mNmf3VVNRESil9bw18A24JPAz7vQttzd30mzPxERyZB074dQA2Bm4aQREZHIWOoWnGkuxGw18E13b3N3kJm9AhwBHPi5u9/XwbIqgAqAwsLC6ZWVlWnnS0ccbpodlxzKEK8cccgQlxxxyBCXHOXl5dXu3u4u/A51dtNl4ElSu4ZOf9zUqs1qYEYHyxgVfD0X2Apc1ZUbPpeVlYV79+luiMNNs93jkUMZ3heHHHHI4B6PHHHI4B6PHMAm78Lna1uPTncZufs13ao0py7jQPD1bTN7CLgMeCbd5YqISHgyftqpmZ1jZoOap4FrSW1hiIhIjKR72uknzGw/8EHgMTN7PHi+xMxWBc2KgHVmthV4DnjM3f+QTr8iIhK+dM8yegh4qI3n3wCuD6b3AlPT6UdERDJPVyqLiAiggiAiIgEVBBERAVQQREQkoIIgIiKACoKIiARUEEREBFBBEBGRgAqCiIgAKggiIhJQQRAREUAFQUREAioIIiICpD/89Y/MbKeZvWBmD5nZ0HbazTWzXWa2x8xuT6dPERHJjHS3EJ4AJrv7FGA38O3TG5hZLnAvcB0wEVhoZhPT7FdEREKWVkFw9/9290QwuwEY3Uazy4A97r7X3RuB+4Gb0ulXRETCZ6l7MoewILOVwAPu/pvTnp8PzHX3rwTzi4HL3f22dpZTAVQAFBYWTq+srAwlX3fV1taSn58faYa45FCGeOWIQ4a45IhDhrjkKC8vr3b3Gd16s7t3+ACeJHUP5NMfN7VqcwepO6dZG++fDyxtNb8YuKezft2dsrIyj1pVVVXUEdw9HjmU4X1xyBGHDO7xyBGHDO7xyAFs8i58vrb16PQWmu5+TUevm9ktwDzgw0GY0x0AxrSaHx08JyIiMZLuWUZzgW8BN7p7XTvNNgLjzOx8M+sHLAAeSadfEREJX7pnGd0DDAKeMLMtZvYzADMrMbNVAJ466Hwb8DhQA1S6+/Y0+xURkZB1usuoI+5+YTvPvwFc32p+FbAqnb5ERCSzdKWyiIgAKggiIhJQQRAREUAFQUREAioIIiICqCCIiEhABUFERAAVBBERCaggiIgIoIIgIiIBFQQREQFUEEREJKCCICIiQJqjnZrZj4CPAY3Ay8AX3f1oG+32AceBJiDh3b29m4iIZEy6WwhPAJPdfQqwG/h2B23L3X2aioGISDylVRDc/b+DG+AAbCB1e0wREemB0tpldJovAQ+085oD/21mDvzc3e9rbyFmVgFUBLMNZrYtxIzdUQC8E3EGiEcOZXhfHHLEIQPEI0ccMkA8cozv7hvN3TtuYPYkMLKNl+5w9/8K2twBzAA+6W0s0MxGufsBMzuX1G6mr7v7M52GM9sU9S6mOGSISw5liFeOOGSIS444ZIhLjnQydLqF4O7XdNL5LcA84MNtFYNgGQeCr2+b2UPAZUCnBUFERLInrWMIZjYX+BZwo7vXtdPmHDMb1DwNXAtEvRtIREROk+5ZRvcAg4AnzGyLmf0MwMxKzGxV0KYIWGdmW4HngMfc/Q9dXH67xxqyKA4ZIB45lOF9ccgRhwwQjxxxyADxyNHtDJ0eQxARkd5BVyqLiAiggiAiIoHYFAQz+5GZ7TSzF8zsITMb2k67fWb2YnDMYlOEOeaa2S4z22Nmt4ec4dNmtt3MkmbW7uljWVgXXc2RyXUx3MyeMLOXgq/D2mnXFKyHLWb2SIj9d/i9mVl/M3sgeP1ZMysNq+8zyHCLmf2p1ff/lQxk+KWZvd3edUGWcneQ8QUzuzTsDF3McbWZHWu1Lr6XgQxjzKzKzHYEfx9/00abjK6PLmY483Xh7rF4kDr7qE8w/a/Av7bTbh9QEGUOIJfU2E0XAP2ArcDEEDNcROriktXAjA7aZXpddJojC+vi/wK3B9O3d/B7UZuB77/T7w34GvCzYHoB8EAEGW4B7snU70HQx1XApcC2dl6/Hvg9YMAs4NmIclwNPJrhdVEMXBpMDyI1bM/pP5OMro8uZjjjdRGbLQSPyTAYXcxxGbDH3fe6eyNwP3BTiBlq3H1XWMvLcI6MrotgWb8Kpn8FfDzEZXemK99b63y/BT5sZpblDBnnqQtJD3fQ5Cbg156yARhqZsUR5Mg4dz/o7puD6eNADTDqtGYZXR9dzHDGYlMQTvMlUtW1Lc3DYFRbapiLKHKMAl5vNb+fEH4Y3ZDNddGeTK+LInc/GEy/Seo05rYMMLNNZrbBzD4eUt9d+d5a2gT/SBwDRoTUf1czAHwq2DXxWzMbE2L/XRWXvwmAD5rZVjP7vZlNymRHwS7CS4BnT3spa+ujgwxwhusizLGMOmVdHwYjASxrZzFXeqthMMxsp3dhGIwM5EhLVzJ0QVbWRaZ1lKH1jLu7pcbDasvYYF1cADxtZi+6+8thZ42plcByd28ws1tJbbF8KOJMUdlM6neh1syuBx4GxmWiIzPLB34H/C93fzcTfaSZ4YzXRVYLgsdkGIwQchwAWv8XNjp4LrQMXVxGxtdFF2R0XZjZW2ZW7O4Hg03ut9tZRvO62Gtmq0n9x5RuQejK99bcZr+Z9QGGAIfS7PeMMrh76/6Wkjrukm1p/x6EofWHoruvMrMlZlbg7qEOOGdmfUl9EC9z9xVtNMn4+ugsQ3fWRWx2GVlMhsHoSg5gIzDOzM43s36kDiaGdmZLV2RjXXRRptfFI8AXgukvAH+21WJmw8ysfzBdAFwB7Aih7658b63zzQeebu+fmUxlOG3f9I2k9idn2yPA54Oza2YBx1rt6ssaMxvZfAzHzC4j9RkXZoEmWP4vgBp3/7d2mmV0fXQlQ7fWRZhHvtN5AHtI7XPbEjyaz9woAVYF0xeQOstiK7Cd1G6NrOfw988i2E3qv9BQcwCfILXPsQF4C3g8onXRaY4srIsRwFPAS8CTwPDg+RnA0mD6L4AXg3XxIvDlEPv/s+8N+AGpfxgABgAPBr83zwEXZODn0FmGfwl+B7YCVcCEDGRYDhwETga/E18Gvgp8NXjdgHuDjC/SwdlxGc5xW6t1sQH4iwxkuJLU8bsXWn1OXJ/N9dHFDGe8LjR0hYiIADHaZSQiItFSQRAREUAFQUREAioIIiICqCCIiEhABUFERAAVBBERCfx/hHvFZ2jy+5UAAAAASUVORK5CYII=\n",
+      "text/plain": [
+       "<Figure size 432x288 with 1 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "color_lut = 'rgbc'\n",
+    "fig = plt.figure()\n",
+    "ax = plt.gca()\n",
+    "xs = []\n",
+    "ys = []\n",
+    "for row in A:\n",
+    "    output_row = np.matmul(I, row)\n",
+    "    x, y, i = output_row\n",
+    "    xs.append(x)\n",
+    "    ys.append(y)\n",
+    "    i = int(i) # convert float to int for indexing\n",
+    "    c = color_lut[i]\n",
+    "    plt.scatter(x, y, color=c)\n",
+    "    plt.text(x + 0.15, y, f\"{string.ascii_letters[i]}\")\n",
+    "xs.append(xs[0])\n",
+    "ys.append(ys[0])\n",
+    "plt.plot(xs, ys, color=\"gray\", linestyle='dotted')\n",
+    "ax.set_xticks(np.arange(-2.5, 3, 0.5))\n",
+    "ax.set_yticks(np.arange(-2.5, 3, 0.5))\n",
+    "plt.grid()\n",
+    "plt.show()"
    ]
   },
   {
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "If you open the picture with an image viewer, you can enlarge or reduce the picture or rotate it. Now the important question: What's going on behind the scene if you do rotate the picture? Or in other words: What does the computer do to achieve the rotation? \n",
+    "The three points $a$, $b$, and $c$ plotted on a grid after applying the Identity transformation to them via a simple vector matrix dot product leaving them unchanged.\n",
+    "\n",
+    "We will now move on to creating a _scaling transformation_ matrix \n",
+    "$T_s$, as shown below, which scales the placement of the points in all directions.\n",
+    "\n",
+    "\n",
+    "$$T_s=\n",
+    "\\left(\\begin{array}{rrr} \n",
+    "2 & 0 & 0 \\\\ \n",
+    "0 & 2 & 0 \\\\ \n",
+    "0 & 0 & 1 \\\\ \n",
+    "\\end{array}\\right)\n",
+    "$$\n",
+    "\n",
     "\n",
-    "One simple solution is using a matrices and vectors."
+    "\n",
+    "\n",
+    "Now we will move on to plotting the transformed points similar to what was done with the original points unaltered by the Identity transformation but, this time we will apply the _scaling transformation_ matrix defined above. For a better visualization, we plot a dotted line connecting the points."
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 105,
+   "execution_count": 285,
    "metadata": {},
    "outputs": [
     {
-     "ename": "ModuleNotFoundError",
-     "evalue": "No module named 'skimage'",
-     "output_type": "error",
-     "traceback": [
-      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
-      "\u001b[0;31mModuleNotFoundError\u001b[0m                       Traceback (most recent call last)",
-      "\u001b[0;32m<ipython-input-105-16d8c7ff678e>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mimport\u001b[0m \u001b[0mskimage\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      2\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mskimage\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtransform\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mrescale\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      3\u001b[0m \u001b[0mimg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrescale\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m.2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      5\u001b[0m \u001b[0mimg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdelete\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimg\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m20\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'skimage'"
-     ]
+     "data": {
+      "text/plain": [
+       "[<matplotlib.axis.YTick at 0x7f0702b4ce10>,\n",
+       " <matplotlib.axis.YTick at 0x7f0702b4c410>,\n",
+       " <matplotlib.axis.YTick at 0x7f0702b51b50>,\n",
+       " <matplotlib.axis.YTick at 0x7f0702b3da50>,\n",
+       " <matplotlib.axis.YTick at 0x7f0702b3da10>,\n",
+       " <matplotlib.axis.YTick at 0x7f0702ac7650>,\n",
+       " <matplotlib.axis.YTick at 0x7f0702ac7350>,\n",
+       " <matplotlib.axis.YTick at 0x7f0702ace0d0>,\n",
+       " <matplotlib.axis.YTick at 0x7f0702ace550>,\n",
+       " <matplotlib.axis.YTick at 0x7f0702aceb10>,\n",
+       " <matplotlib.axis.YTick at 0x7f0702b3d590>]"
+      ]
+     },
+     "execution_count": 285,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<Figure size 432x288 with 1 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
     }
    ],
    "source": [
-    "import skimage\n",
-    "from skimage.transform import rescale\n",
-    "img = rescale(img, .2)\n",
-    "\n",
-    "img = np.delete(img,np.arange(20), axis=0)\n",
-    "img = np.delete(img,np.arange(80,100), axis=0)\n",
-    "img = np.delete(img,np.arange(20), axis=1)\n",
-    "img = np.delete(img,np.arange(80,100), axis=1)\n",
+    "# create the scaling transformation matrix\n",
+    "T_s = np.array([[2, 0, 0], [0, 2, 0], [0, 0, 1]])\n",
     "\n",
-    "col =np.zeros(img.shape[0]*img.shape[1])\n",
+    "fig = plt.figure()\n",
+    "ax = plt.gca()\n",
+    "xs_s = []\n",
+    "ys_s = []\n",
+    "for row in A:\n",
+    "    output_row = np.matmul(T_s, row)\n",
+    "    x, y, i = row\n",
+    "    x_s, y_s, i_s = output_row\n",
+    "    xs_s.append(x_s)\n",
+    "    ys_s.append(y_s)\n",
+    "    i, i_s = int(i), int(i_s) # convert float to int for indexing\n",
+    "    c, c_s = color_lut[i], color_lut[i_s] # these are the same but, its good to be explicit\n",
+    "    plt.scatter(x, y, color=c)\n",
+    "    plt.scatter(x_s, y_s, color=c_s)\n",
+    "    plt.text(x + 0.15, y, f\"{string.ascii_letters[int(i)]}\")\n",
+    "    plt.text(x_s + 0.15, y_s, f\"{string.ascii_letters[int(i_s)]}'\")\n",
     "\n",
-    "k = 0\n",
-    "for i in np.arange(img.shape[0]):\n",
-    "    for j in np.arange(img.shape[1]):\n",
-    "        col[k] = np.round(.99*img[i,j,:],0)\n",
-    "        k = k+1\n",
-    "        \n",
-    "image = np.array([np.repeat(np.arange(img.shape[0]),img.shape[1]), np.tile(np.arange(img.shape[1]),img.shape[0])]).T\n",
-    "image[:,0] = image[:,0] - 40\n",
-    "image[:,1] = image[:,1] - 40\n",
-    "\n",
-    "image = image[col==0,:]\n",
+    "xs_s.append(xs_s[0])\n",
+    "ys_s.append(ys_s[0])\n",
+    "plt.plot(xs, ys, color=\"gray\", linestyle='dotted')\n",
+    "plt.plot(xs_s, ys_s, color=\"gray\", linestyle='dotted')\n",
+    "ax.set_xticks(np.arange(-2.5, 3, 0.5))\n",
+    "ax.set_yticks(np.arange(-2.5, 3, 0.5))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 277,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<Figure size 432x288 with 1 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "# create the rotation transformation matrix\n",
+    "T_r = np.array([[0, 1, 0], [-1, 0, 0], [0, 0, 1]])\n",
     "\n",
+    "fig = plt.figure()\n",
+    "ax = plt.gca()\n",
+    "for row in A:\n",
+    "    output_row = np.matmul(T_r, row)\n",
+    "    x_r, y_r, i_r = output_row\n",
+    "    i_r = int(i_r) # convert float to int for indexing\n",
+    "    c_r = color_lut[i_r] # these are the same but, its good to be explicit\n",
+    "    letter_r = string.ascii_letters[i_r]\n",
+    "    plt.scatter(x_r, y_r, color=c_r)\n",
+    "    plt.text(x_r + 0.15, y_r, f\"{letter_r}'\")\n",
     "\n",
-    "plt.plot(image[:,0],image[:,1],\"o\",color=\"black\")\n",
-    "plt.axis('square')\n",
-    "plt.xlim(-40,40)\n",
-    "plt.ylim(-40,40)\n",
-    "plt.savefig(\"bug01.eps\",bbox_inches=\"tight\")"
+    "plt.plot(xs, ys, color=\"gray\", linestyle='dotted')\n",
+    "ax.set_xticks(np.arange(-2.5, 3, 0.5))\n",
+    "ax.set_yticks(np.arange(-2.5, 3, 0.5))\n",
+    "plt.grid()\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 278,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "image/png": "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Dl+MLtw5HA7mzp1rNbYnT55k3759EV0evbGxEZfLZcsQ3XAXmZ8IGxw8eJC33npLi9HhOcN08+bN1rro6MXowl3TYnnbt2+npKSE8+fP25zKPldeeSVz587F4XDQ0NDAihUrdIiqlzYIQeRyuTh27BjgKUY3b968iC5Gt2XLFowxxMTE8PDDD3fKYnThbtq0aTz88MPW8NSysrKILpb31VdfUVFREdHVZJvSBiGI3n77bf785z9bF/bIzs6O2C3h8vJy3n77basYXSSPgLGTiJCamgrAkSNHWL58ecQXy/vpT39KdnY2ADt27LAqCkciPYYQYI2NjbjdbmJiYpg0aRKDBw8mNjbW7li2qK+v5+TJk/Tp04fhw4eTmppK37597Y6lvDIzM7n33nutyqEnT54kMTExoovlrVmzhszMTGbNmmVzKntoDyGAnE4nf/jDH3j//fcBz5h634kxkWjFihW8/PLLOJ1OREQbgzB0xRVXEBUVhdvt5pVXXuHll1+2O5JtoqOjefjhh5kxYwbgKVR3+HCzNTg7Le0hBICvGF10dDRjxowhIyPD7ki2aVqMrqCggMbGRqKj9WMW7hwOBzfddJP12M5ieXZqemLo2rVr2bZtm63F8kJNewh+OnLkCM8888wFxeh8XXCAJ598khdeeMGecCFWU1PDwoULLyhG57tewZNPPslTTz1lZzzViv79+we9WN7Bgwet8wHC3fTp05k9e7bVGJw4cSIky236/RFq2iD4KTU1ldTU1IgsJubTtBjdVVddFbEjqTqTzMxMBg8eHPHF8q644grAUyxv4cKFnb5YnjYI7bB7925ef/11qxjdfffdZxWje/HFFxk5ciSjRo1i7ty5JCQkdOr6RPv372fBggWcOnUKgClTpljrYv78+eTl5TF58mT27t1rZ0x1mTIzM7npppsQEWpqavjv//5vKioqAjJvp9NJYWEhQ4YMYebMmdTU1ARkvsHUp08frrvuOuuYYH19fSvvaJvvf//7jB07lmHDhrF48WIAW6/+pjt326G6upqTJ09SX19/wQii3bt385vf/IaPP/6Ynj17cvLkSat+SmfVs2fPZiuzlpaW8sorr7Bt2zacTidjxoxh7Fi9DEZH5PucB+rM+r179/KnP/2JSZMm8YMf/IBFixbx85//PCDzDpbo6GgmT54MeI4Z/uUvfyE9PZ1b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\n",
+      "text/plain": [
+       "<Figure size 432x288 with 1 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "# create combined tranformation matrix\n",
+    "T = np.matmul(T_s, T_r)\n",
+    "\n",
+    "fig = plt.figure()\n",
+    "ax = plt.gca()\n",
+    "\n",
+    "xs_comb = []\n",
+    "ys_comb = []\n",
+    "for row in A:\n",
+    "    output_row = T @ row\n",
+    "    x, y, i = row\n",
+    "    x_comb, y_comb, i_comb = output_row\n",
+    "    xs_comb.append(x_comb)\n",
+    "    ys_comb.append(y_comb)\n",
+    "    i, i_comb = int(i), int(i_comb) # convert float to int for indexing\n",
+    "    c, c_comb = color_lut[i], color_lut[i_comb] # these are the same but, its good to be explicit\n",
+    "    letter, letter_comb = string.ascii_letters[i], string.ascii_letters[i_comb]\n",
+    "    plt.scatter(x, y, color=c)\n",
+    "    plt.scatter(x_comb, y_comb, color=c_comb)\n",
+    "    plt.text(x + 0.15 , y, f\"{letter}\")\n",
+    "    plt.text(x_comb + 0.15, y_comb, f\"{letter_comb}'\")\n",
+    "xs_comb.append(xs_comb[0])\n",
+    "ys_comb.append(ys_comb[0])\n",
+    "plt.plot(xs, ys, color=\"gray\", linestyle='dotted')\n",
+    "plt.plot(xs_comb, ys_comb, color=\"gray\", linestyle='dotted')\n",
+    "ax.set_xticks(np.arange(-2.5, 3, 0.5))\n",
+    "ax.set_yticks(np.arange(-2.5, 3, 0.5))\n",
+    "plt.grid()\n",
+    "plt.show()\n"
    ]
   },
   {
-- 
GitLab