{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Welcome to the jupyter notebook! To run any cell, press `Shift+Enter` or `Ctrl+Enter`.\n",
    "\n",
    "**IMPORTANT** : Please have a look at `Help->User Interface Tour` and `Help->Keyboard Shortcuts` in the toolbar above that will help you get started."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:25.022108Z",
     "iopub.status.busy": "2022-10-20T20:19:25.021809Z",
     "iopub.status.idle": "2022-10-20T20:19:26.405592Z",
     "shell.execute_reply": "2022-10-20T20:19:26.404895Z"
    }
   },
   "outputs": [],
   "source": [
    "# Useful starting lines\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "%load_ext autoreload\n",
    "%autoreload 2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Notebook Basics"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "A cell contains any type of python inputs (expression, function definitions, etc...). Running a cell is equivalent to input this block in the python interpreter. The notebook will print the output of the last executed line."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:26.408763Z",
     "iopub.status.busy": "2022-10-20T20:19:26.408560Z",
     "iopub.status.idle": "2022-10-20T20:19:26.428070Z",
     "shell.execute_reply": "2022-10-20T20:19:26.427637Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:26.451068Z",
     "iopub.status.busy": "2022-10-20T20:19:26.450807Z",
     "iopub.status.idle": "2022-10-20T20:19:26.468838Z",
     "shell.execute_reply": "2022-10-20T20:19:26.468103Z"
    }
   },
   "outputs": [],
   "source": [
    "x = [2, 3, 4]\n",
    "\n",
    "\n",
    "def my_function(l):\n",
    "    l.append(12)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:26.471724Z",
     "iopub.status.busy": "2022-10-20T20:19:26.471518Z",
     "iopub.status.idle": "2022-10-20T20:19:26.490095Z",
     "shell.execute_reply": "2022-10-20T20:19:26.489608Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[2, 3, 4, 12]"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "my_function(x)\n",
    "\n",
    "x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:26.493038Z",
     "iopub.status.busy": "2022-10-20T20:19:26.492630Z",
     "iopub.status.idle": "2022-10-20T20:19:26.694634Z",
     "shell.execute_reply": "2022-10-20T20:19:26.694181Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0, 0.5, 'Y label')"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjsAAAGwCAYAAABPSaTdAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAxEklEQVR4nO3dfXRU1b3/8U8eSHicieGSGbJIIEUqRHmSh2SA26rkEjBYuQQrNkJUFI0JLUQR0vIgiIRSKxREsOgFtHBR2gI1XJAQFFoIEaIogqToRQPCJFRuZgAXSUjm94eL+TUCNYGZnMnJ+7XWWctz9p45363ifNznnH2CPB6PRwAAACYVbHQBAAAA/kTYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAAphZqdAGBoLa2VqdOnVK7du0UFBRkdDkAAKAePB6Pzp07p+joaAUHX3v+hrAj6dSpU4qJiTG6DAAAcB1OnDihTp06XbOdsCOpXbt2kr79m2WxWAyuBgAA1Ifb7VZMTIz3d/xaCDuS99KVxWIh7AAA0MR83y0o3KAMAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMzdCwU1NTo5kzZyouLk6tWrVS165d9dxzz8nj8Xj7eDwezZo1Sx07dlSrVq2UlJSkY8eO1fmes2fPKi0tTRaLRREREZowYYLOnz/f2MMBAAABKNTIk//617/W8uXLtWbNGt166606cOCAHn74YVmtVv385z+XJC1cuFBLlizRmjVrFBcXp5kzZyo5OVlHjhxRy5YtJUlpaWk6ffq08vPzVV1drYcfflgTJ07UunXrjBwegCaoy/Qt9e77xYIUP1YCwFeCPP88jdLIRo4cKZvNptdee817LDU1Va1atdIf/vAHeTweRUdH66mnntLTTz8tSXK5XLLZbFq9erXGjh2rTz/9VPHx8dq/f7/69+8vSdq2bZvuvvtunTx5UtHR0d9bh9vtltVqlcvlksVi8c9gATQJhB2g6ajv77ehl7EGDRqkgoIC/f3vf5ckffTRR/rb3/6mESNGSJKOHz8up9OppKQk72esVqsSEhJUWFgoSSosLFRERIQ36EhSUlKSgoODVVRUdNXzVlZWyu12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CvqX29GjR7V06VKdO3dOOTk5Rpd8Xeo7zsumTp2qDz/8UNu3b1dISIjGjx8vTxNZxLuhY5Wkr776SsOHD9d9992nxx57zKDKG+Z6xgk0FZmZmfrkk0+0fv16o0vxm1tuuUUHDx5UUVGRMjIylJ6eriNHjhhdlqF4XYSfnDlzRl9//fW/7PODH/xAP/3pT/X2228rKCjIe7ympkYhISFKS0vTmjVr/F3qDanvOMPCwq44fvLkScXExGjv3r1NYoq1oWM9deqU7rjjDiUmJmr16tUKDm4a/29xPf9MV69ercmTJ6uiosLP1flfVVWVWrdurT/+8Y8aNWqU93h6eroqKipMOxsZFBSkjRs31hmz2WRlZWnz5s3avXu34uLijC6n0SQlJalr16565ZVXjC7FMKZ4EWgg6tChgzp06PC9/ZYsWaJ58+Z590+dOqXk5GS9+eabSkhI8GeJPlHfcV5NbW2tpG8fuW8KGjLWr776Snfeeaf69eunVatWNZmgI93YP1MzCAsLU79+/VRQUOD94a+trVVBQYGysrKMLQ7XxePxaNKkSdq4caPee++9ZhV0pG///W0q/531F8KOwWJjY+vst23bVpLUtWtXderUyYiS/KKoqEj79+/XkCFDdNNNN+nzzz/XzJkz1bVr1yYxq9MQX331le644w517txZL7zwgs6cOeNts9vtBlbme6WlpTp79qxKS0tVU1PjXR/q5ptv9v673BRlZ2crPT1d/fv318CBA7V48WJduHBBDz/8sNGl+dT58+f12WefefePHz+ugwcPKjIy8or/NjVlmZmZWrdunTZv3qx27dp5772yWq1q1aqVwdX5Vk5OjkaMGKHY2FidO3dO69at03vvvad33nnH6NKMZeizYLjC8ePHTfno+ccff+y58847PZGRkZ7w8HBPly5dPE888YTn5MmTRpfmc6tWrfJIuupmNunp6Vcd57vvvmt0aTds6dKlntjYWE9YWJhn4MCBnn379hldks+9++67V/3nl56ebnRpPnWtP4+rVq0yujSfe+SRRzydO3f2hIWFeTp06OAZOnSoZ/v27UaXZTju2QEAAKbWdG4kAAAAuA6EHQAAYGqEHQAAYGqEHQAAYGqEHQAAYGqEHQAAYGqEHQAAYGqEHQAAYGqEHQBNWpcuXbR48eJ691+9erUiIiJu+LxBQUHatGnTDX8PAP8j7AAwXE1NjQYNGqTRo0fXOe5yuRQTE6Nf/epXBlUGwAwIOwAMFxISotWrV2vbtm1au3at9/ikSZMUGRmp2bNnG1gdgKaOsAMgIPzwhz/UggULNGnSJJ0+fVqbN2/W+vXr9frrryssLKze3/Piiy+qZ8+eatOmjWJiYvTkk0/q/PnzV/TbtGmTunXrppYtWyo5OVknTpyo075582bdfvvtatmypX7wgx9ozpw5unTp0g2PE0DjI+wACBiTJk1S7969NW7cOE2cOFGzZs1S7969G/QdwcHBWrJkiQ4fPqw1a9Zo586deuaZZ+r0+eabb/T888/r9ddf1549e1RRUaGxY8d62//6179q/Pjx+sUvfqEjR47olVde0erVq/X888/7ZJwAGpnRr10HgH/26aefeiR5evbs6amurv7e/p07d/YsWrTomu0bNmzwtG/f3ru/atUqjyTPvn37rjhnUVGRx+PxeIYOHeqZP39+ne954403PB07dvTuS/Js3LixnqMCYKRQY6MWANT1X//1X2rdurWOHz+ukydPqkuXLg36/I4dO5Sbm6ujR4/K7Xbr0qVLunjxor755hu1bt1akhQaGqoBAwZ4P9O9e3dFRETo008/1cCBA/XRRx9pz549dWZyampqrvgeAE0Dl7EABIy9e/dq0aJFysvL08CBAzVhwgR5PJ56f/6LL77QyJEj1atXL/3pT39ScXGxli1bJkmqqqqq9/ecP39ec+bM0cGDB73boUOHdOzYMbVs2bLB4wJgLGZ2AASEb775Rg899JAyMjJ05513Ki4uTj179tSKFSuUkZFRr+8oLi5WbW2tfvvb3yo4+Nv/l3vrrbeu6Hfp0iUdOHBAAwcOlCSVlJSooqJCPXr0kCTdfvvtKikp0c033+yj0QEwEmEHQEDIycmRx+PRggULJH27WOALL7ygp59+WiNGjKjX5aybb75Z1dXVWrp0qe655x7t2bNHK1asuKJfixYtNGnSJC1ZskShoaHKyspSYmKiN/zMmjVLI0eOVGxsrMaMGaPg4GB99NFH+uSTTzRv3jyfjhuA/3EZC4Dhdu3apWXLlmnVqlV17od5/PHHNWjQoHpfzurdu7defPFF/frXv9Ztt92mtWvXKjc394p+rVu31rRp0/Szn/1MgwcPVtu2bfXmm29625OTk5WXl6ft27drwIABSkxM1KJFi9S5c2ffDBhAowryNOSCOAAAQBPDzA4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADA1wg4AADC1/wecMAMlwm1XbAAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Matplotlib is used for plotting, plots are directly embedded in the\n",
    "# notebook thanks to the '%matplolib inline' command at the beginning\n",
    "plt.hist(np.random.randn(10000), bins=40)\n",
    "plt.xlabel(\"X label\")\n",
    "plt.ylabel(\"Y label\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Numpy Basics\n",
    "============"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**IMPORTANT** : the numpy documentation is quite good. The Notebook system is really good to help you. Use the Auto-Completion with `Tab`, and use `Shift+Tab` to get the complete documentation about the current function (when the cursor is between the parenthesis of the function for instance).\n",
    "\n",
    "For example, you want to multiply two arrays. `np.mul` + `Tab` complete to the only valid function `np.multiply`. Then using `Shift+Tab` you learn `np.multiply` is actually the element-wise multiplication and is equivalent to the `*` operator."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:26.697634Z",
     "iopub.status.busy": "2022-10-20T20:19:26.697428Z",
     "iopub.status.idle": "2022-10-20T20:19:26.716027Z",
     "shell.execute_reply": "2022-10-20T20:19:26.715555Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<ufunc 'multiply'>"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.multiply"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Creation of arrays\n",
    "\n",
    "Creating ndarrays (`np.zeros`, `np.ones`) is done by giving the shape as an iterable (List or Tuple). An integer is also accepted for one-dimensional array.\n",
    "\n",
    "`np.eye` creates an identity matrix.\n",
    "\n",
    "You can also create an array by giving iterables to it.\n",
    "\n",
    "(NB : The random functions `np.random.rand` and `np.random.randn` are exceptions though)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:26.718930Z",
     "iopub.status.busy": "2022-10-20T20:19:26.718749Z",
     "iopub.status.idle": "2022-10-20T20:19:26.737566Z",
     "shell.execute_reply": "2022-10-20T20:19:26.737104Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0., 0., 0., 0.])"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.zeros(4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:26.740162Z",
     "iopub.status.busy": "2022-10-20T20:19:26.739994Z",
     "iopub.status.idle": "2022-10-20T20:19:26.758915Z",
     "shell.execute_reply": "2022-10-20T20:19:26.758382Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1., 0., 0.],\n",
       "       [0., 1., 0.],\n",
       "       [0., 0., 1.]])"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.eye(3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:26.761580Z",
     "iopub.status.busy": "2022-10-20T20:19:26.761393Z",
     "iopub.status.idle": "2022-10-20T20:19:26.780172Z",
     "shell.execute_reply": "2022-10-20T20:19:26.779771Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 3, 4],\n",
       "       [2, 5, 6]])"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.array([[1, 3, 4], [2, 5, 6]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:26.782843Z",
     "iopub.status.busy": "2022-10-20T20:19:26.782679Z",
     "iopub.status.idle": "2022-10-20T20:19:26.801103Z",
     "shell.execute_reply": "2022-10-20T20:19:26.800555Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.arange(10)  # NB : np.array(range(10)) is a slightly more complicated equivalent"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:26.803620Z",
     "iopub.status.busy": "2022-10-20T20:19:26.803404Z",
     "iopub.status.idle": "2022-10-20T20:19:26.822059Z",
     "shell.execute_reply": "2022-10-20T20:19:26.821612Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-0.16249426,  0.12874363, -0.23708515,  0.2662186 ],\n",
       "       [ 0.29780723,  2.32306018,  0.02953589,  0.07776264],\n",
       "       [ 1.20722021,  1.07160756, -1.74754213, -0.85710497]])"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.random.randn(3, 4)  # normal distributed values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:26.824647Z",
     "iopub.status.busy": "2022-10-20T20:19:26.824454Z",
     "iopub.status.idle": "2022-10-20T20:19:26.843033Z",
     "shell.execute_reply": "2022-10-20T20:19:26.842587Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[[1., 1.],\n",
       "        [1., 1.],\n",
       "        [1., 1.],\n",
       "        [1., 1.]],\n",
       "\n",
       "       [[1., 1.],\n",
       "        [1., 1.],\n",
       "        [1., 1.],\n",
       "        [1., 1.]]])"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 3-D tensor\n",
    "tensor_3 = np.ones((2, 4, 2))\n",
    "tensor_3"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### ndarray basics\n",
    "\n",
    "A ndarray python object is just a reference to the data location and its characteristics.\n",
    "\n",
    "All numpy operations applying on an array can be called np._function_(a) or a._function_() (i.e `np.sum(a)` or `a.sum()`)\n",
    "\n",
    "It has an attribute `shape` that returns a tuple of the different dimensions of the ndarray. It also has an attribute `dtype` that describes the type of data of the object (default type is `float64`)\n",
    "\n",
    "**WARNING** because of the object structure, unless you call `copy()` copying the reference is not copying the data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:26.845962Z",
     "iopub.status.busy": "2022-10-20T20:19:26.845643Z",
     "iopub.status.idle": "2022-10-20T20:19:26.864323Z",
     "shell.execute_reply": "2022-10-20T20:19:26.863893Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((2, 4, 2), dtype('float64'))"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tensor_3.shape, tensor_3.dtype"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:26.866859Z",
     "iopub.status.busy": "2022-10-20T20:19:26.866671Z",
     "iopub.status.idle": "2022-10-20T20:19:26.884944Z",
     "shell.execute_reply": "2022-10-20T20:19:26.884471Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(dtype('int64'), dtype('float64'))"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = np.array([[1.0, 2.0], [5.0, 4.0]])\n",
    "b = np.array([[4, 3], [2, 1]])\n",
    "(b.dtype, a.dtype)  # each array has a data type (casting rules apply for int -> float)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:26.887590Z",
     "iopub.status.busy": "2022-10-20T20:19:26.887409Z",
     "iopub.status.idle": "2022-10-20T20:19:26.905982Z",
     "shell.execute_reply": "2022-10-20T20:19:26.905259Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['Mickey', 'Mouse'], dtype='<U6')"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.array([\"Mickey\", \"Mouse\"])  # can hold more than just numbers"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:26.908278Z",
     "iopub.status.busy": "2022-10-20T20:19:26.908114Z",
     "iopub.status.idle": "2022-10-20T20:19:26.926979Z",
     "shell.execute_reply": "2022-10-20T20:19:26.926492Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[3., 2.],\n",
       "       [5., 4.]])"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = np.array([[1.0, 2.0], [5.0, 4.0]])\n",
    "b = a  # Copying the reference only\n",
    "b[0, 0] = 3\n",
    "a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:26.929454Z",
     "iopub.status.busy": "2022-10-20T20:19:26.929288Z",
     "iopub.status.idle": "2022-10-20T20:19:26.948186Z",
     "shell.execute_reply": "2022-10-20T20:19:26.947655Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1., 2.],\n",
       "       [5., 4.]])"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = np.array([[1.0, 2.0], [5.0, 4.0]])\n",
    "b = a.copy()  # Deep-copy of the data\n",
    "b[0, 0] = 3\n",
    "a"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Basic operators are working element-wise (+, -, *, /)\n",
    "\n",
    "When trying to apply operators for arrays with different sizes, they are very specific rules that you might want to understand in the future : http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:26.951111Z",
     "iopub.status.busy": "2022-10-20T20:19:26.950947Z",
     "iopub.status.idle": "2022-10-20T20:19:26.969578Z",
     "shell.execute_reply": "2022-10-20T20:19:26.969056Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-0.69583602,  0.24520908,  0.44772723,  0.35083724],\n",
       "       [ 1.76404098, -2.49221099,  0.94502621,  2.23224345]])"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.ones((2, 4)) * np.random.randn(2, 4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:26.972197Z",
     "iopub.status.busy": "2022-10-20T20:19:26.972031Z",
     "iopub.status.idle": "2022-10-20T20:19:26.990953Z",
     "shell.execute_reply": "2022-10-20T20:19:26.990389Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0., -1., -1.],\n",
       "       [-1.,  0., -1.],\n",
       "       [-1., -1.,  0.]])"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.eye(3) - np.ones((3, 3))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:26.993497Z",
     "iopub.status.busy": "2022-10-20T20:19:26.993295Z",
     "iopub.status.idle": "2022-10-20T20:19:27.011809Z",
     "shell.execute_reply": "2022-10-20T20:19:27.011275Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1. 2.]\n",
      " [5. 4.]]\n",
      "(2, 2)\n",
      "2\n"
     ]
    }
   ],
   "source": [
    "print(a)\n",
    "print(a.shape)  # Get shape\n",
    "print(a.shape[0])  # Get size of first dimension"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Accessing elements and slicing\n",
    "\n",
    "For people uncomfortable with the slicing of arrays, please have a look at the 'Indexing and Slicing' section of http://www.python-course.eu/numpy.php"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:27.014562Z",
     "iopub.status.busy": "2022-10-20T20:19:27.014375Z",
     "iopub.status.idle": "2022-10-20T20:19:27.033148Z",
     "shell.execute_reply": "2022-10-20T20:19:27.032393Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1. 2.]\n",
      "[2. 4.]\n",
      "2.0\n"
     ]
    }
   ],
   "source": [
    "print(a[0])  # Get first line (slice for the first dimension)\n",
    "print(a[:, 1])  # Get second column (slice for the second dimension)\n",
    "print(a[0, 1])  # Get first line second column element"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Changing the shape of arrays\n",
    "\n",
    "`ravel` creates a flattened view of an array (1-D representation) whereas `flatten` creates flattened copy of the array.\n",
    "\n",
    "`reshape` allows in-place modification of the shape of the data. `transpose` shuffles the dimensions.\n",
    "\n",
    "`np.newaxis` allows the creation of empty dimensions."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:27.036190Z",
     "iopub.status.busy": "2022-10-20T20:19:27.035980Z",
     "iopub.status.idle": "2022-10-20T20:19:27.054615Z",
     "shell.execute_reply": "2022-10-20T20:19:27.053846Z"
    }
   },
   "outputs": [],
   "source": [
    "a = np.array([[1.0, 2.0], [5.0, 4.0]])\n",
    "b = np.array([[4, 3], [2, 1]])\n",
    "v = np.array([0.5, 2.0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:27.057610Z",
     "iopub.status.busy": "2022-10-20T20:19:27.057372Z",
     "iopub.status.idle": "2022-10-20T20:19:27.075866Z",
     "shell.execute_reply": "2022-10-20T20:19:27.075287Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1. 2.]\n",
      " [5. 4.]]\n",
      "[[1. 5.]\n",
      " [2. 4.]]\n",
      "[1. 2. 5. 4.]\n"
     ]
    }
   ],
   "source": [
    "print(a)\n",
    "print(a.T)  # Equivalent : a.tranpose(), np.transpose(a)\n",
    "print(a.ravel())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:27.078384Z",
     "iopub.status.busy": "2022-10-20T20:19:27.078196Z",
     "iopub.status.idle": "2022-10-20T20:19:27.097226Z",
     "shell.execute_reply": "2022-10-20T20:19:27.096636Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(4, 5)\n",
      "(1, 4, 5)\n",
      "(5, 4)\n",
      "(10, 2)\n",
      "[[ 1.21081953 -0.69174291 -0.25755627  0.90728223  0.0308461 ]\n",
      " [-0.33345465 -1.5188289  -1.0725233   1.10118675 -0.90079774]\n",
      " [ 0.65788445 -0.60147055  0.73517411 -0.08627955  0.8193513 ]\n",
      " [-0.74605167 -0.07800422  1.37779686  1.28162676 -1.78873611]]\n",
      "[[ 1.21081953 -0.69174291]\n",
      " [-0.25755627  0.90728223]\n",
      " [ 0.0308461  -0.33345465]\n",
      " [-1.5188289  -1.0725233 ]\n",
      " [ 1.10118675 -0.90079774]\n",
      " [ 0.65788445 -0.60147055]\n",
      " [ 0.73517411 -0.08627955]\n",
      " [ 0.8193513  -0.74605167]\n",
      " [-0.07800422  1.37779686]\n",
      " [ 1.28162676 -1.78873611]]\n"
     ]
    }
   ],
   "source": [
    "c = np.random.randn(4, 5)\n",
    "print(c.shape)\n",
    "print(c[np.newaxis].shape)  # Adding a dimension\n",
    "print(c.T.shape)\n",
    "print(c.reshape([10, 2]).shape)\n",
    "print(c)\n",
    "print(c.reshape([10, 2]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:27.099915Z",
     "iopub.status.busy": "2022-10-20T20:19:27.099725Z",
     "iopub.status.idle": "2022-10-20T20:19:27.117743Z",
     "shell.execute_reply": "2022-10-20T20:19:27.117270Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1.],\n",
       "       [2.],\n",
       "       [5.],\n",
       "       [4.]])"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a.reshape((-1, 1))  # a[-1] means 'whatever needs to go there'"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Reduction operations\n",
    "\n",
    "Reduction operations (`np.sum`, `np.max`, `np.min`, `np.std`) work on the flattened ndarray by default. You can specify the reduction axis as an argument"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:27.120479Z",
     "iopub.status.busy": "2022-10-20T20:19:27.120290Z",
     "iopub.status.idle": "2022-10-20T20:19:27.149492Z",
     "shell.execute_reply": "2022-10-20T20:19:27.148769Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(np.float64(12.0), array([6., 6.]), array([3., 9.]))"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.sum(a), np.sum(a, axis=0), np.sum(\n",
    "    a, axis=1\n",
    ")  # reduce-operations reduce the whole array if no axis is specified"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Linear-algebra operations"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:27.152642Z",
     "iopub.status.busy": "2022-10-20T20:19:27.152445Z",
     "iopub.status.idle": "2022-10-20T20:19:27.170910Z",
     "shell.execute_reply": "2022-10-20T20:19:27.170440Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 8.,  5.],\n",
       "       [28., 19.]])"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.dot(a, b)  # matrix multiplication"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:27.173394Z",
     "iopub.status.busy": "2022-10-20T20:19:27.173238Z",
     "iopub.status.idle": "2022-10-20T20:19:27.191715Z",
     "shell.execute_reply": "2022-10-20T20:19:27.191280Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Other ways of writing matrix multiplication, the '@' operator for matrix multiplication\n",
    "# was introduced in Python 3.5\n",
    "np.allclose(a.dot(b), a @ b)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:27.194451Z",
     "iopub.status.busy": "2022-10-20T20:19:27.194300Z",
     "iopub.status.idle": "2022-10-20T20:19:27.213354Z",
     "shell.execute_reply": "2022-10-20T20:19:27.212772Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "EigResult(eigenvalues=array([-1.,  6.]), eigenvectors=array([[-0.70710678, -0.37139068],\n",
       "       [ 0.70710678, -0.92847669]]))"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# For other linear algebra operations, use the np.linalg module\n",
    "np.linalg.eig(a)  # Eigen-decomposition"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:27.215770Z",
     "iopub.status.busy": "2022-10-20T20:19:27.215608Z",
     "iopub.status.idle": "2022-10-20T20:19:27.235011Z",
     "shell.execute_reply": "2022-10-20T20:19:27.234353Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[-0.66666667  0.33333333]\n",
      " [ 0.83333333 -0.16666667]]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print(np.linalg.inv(a))  # Inverse\n",
    "np.allclose(np.linalg.inv(a) @ a, np.identity(a.shape[1]))  # a^-1 * a = Id"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:27.237744Z",
     "iopub.status.busy": "2022-10-20T20:19:27.237575Z",
     "iopub.status.idle": "2022-10-20T20:19:27.256373Z",
     "shell.execute_reply": "2022-10-20T20:19:27.255714Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.33333333, 0.08333333])"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.linalg.solve(a, v)  # solves ax = v"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Grouping operations\n",
    "\n",
    "Grouping operations (`np.stack`, `np.hstack`, `np.vstack`, `np.concatenate`) take an iterable of ndarrays and not ndarrays as separate arguments : np.concatenate([a,b]) and not np.concatenate(a,b)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:27.259085Z",
     "iopub.status.busy": "2022-10-20T20:19:27.258884Z",
     "iopub.status.idle": "2022-10-20T20:19:27.278194Z",
     "shell.execute_reply": "2022-10-20T20:19:27.277651Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1., 2., 4., 3.],\n",
       "       [5., 4., 2., 1.]])"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.hstack([a, b])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:27.281046Z",
     "iopub.status.busy": "2022-10-20T20:19:27.280873Z",
     "iopub.status.idle": "2022-10-20T20:19:27.300500Z",
     "shell.execute_reply": "2022-10-20T20:19:27.300008Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1., 2.],\n",
       "       [5., 4.],\n",
       "       [4., 3.],\n",
       "       [2., 1.]])"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.vstack([a, b])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:27.303098Z",
     "iopub.status.busy": "2022-10-20T20:19:27.302935Z",
     "iopub.status.idle": "2022-10-20T20:19:27.321636Z",
     "shell.execute_reply": "2022-10-20T20:19:27.321178Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1.5, 4. ],\n",
       "       [5.5, 6. ],\n",
       "       [4.5, 5. ],\n",
       "       [2.5, 3. ]])"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.vstack([a, b]) + v  # broadcasting"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:27.324098Z",
     "iopub.status.busy": "2022-10-20T20:19:27.323908Z",
     "iopub.status.idle": "2022-10-20T20:19:27.744380Z",
     "shell.execute_reply": "2022-10-20T20:19:27.743810Z"
    }
   },
   "outputs": [
    {
     "ename": "ValueError",
     "evalue": "operands could not be broadcast together with shapes (2,4) (2,) ",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mValueError\u001b[0m                                Traceback (most recent call last)",
      "Cell \u001b[0;32mIn[35], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mhstack\u001b[49m\u001b[43m(\u001b[49m\u001b[43m[\u001b[49m\u001b[43ma\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mb\u001b[49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mv\u001b[49m  \u001b[38;5;66;03m# does not work\u001b[39;00m\n",
      "\u001b[0;31mValueError\u001b[0m: operands could not be broadcast together with shapes (2,4) (2,) "
     ]
    }
   ],
   "source": [
    "np.hstack([a, b]) + v  # does not work"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:27.747172Z",
     "iopub.status.busy": "2022-10-20T20:19:27.746982Z",
     "iopub.status.idle": "2022-10-20T20:19:27.773663Z",
     "shell.execute_reply": "2022-10-20T20:19:27.773122Z"
    }
   },
   "outputs": [
    {
     "ename": "ValueError",
     "evalue": "operands could not be broadcast together with shapes (2,4) (2,) ",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mValueError\u001b[0m                                Traceback (most recent call last)",
      "Cell \u001b[0;32mIn[36], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mhstack\u001b[49m\u001b[43m(\u001b[49m\u001b[43m[\u001b[49m\u001b[43ma\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mb\u001b[49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mv\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mT\u001b[49m  \u001b[38;5;66;03m# transposing a 1-D array achieves nothing\u001b[39;00m\n",
      "\u001b[0;31mValueError\u001b[0m: operands could not be broadcast together with shapes (2,4) (2,) "
     ]
    }
   ],
   "source": [
    "np.hstack([a, b]) + v.T  # transposing a 1-D array achieves nothing"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:27.776501Z",
     "iopub.status.busy": "2022-10-20T20:19:27.776175Z",
     "iopub.status.idle": "2022-10-20T20:19:27.795209Z",
     "shell.execute_reply": "2022-10-20T20:19:27.794802Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1.5, 2.5, 4.5, 3.5],\n",
       "       [7. , 6. , 4. , 3. ]])"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.hstack([a, b]) + v.reshape(\n",
    "    (-1, 1)\n",
    ")  # reshaping to convert v from a (2,) vector to a (2,1) matrix"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:27.797801Z",
     "iopub.status.busy": "2022-10-20T20:19:27.797618Z",
     "iopub.status.idle": "2022-10-20T20:19:27.816517Z",
     "shell.execute_reply": "2022-10-20T20:19:27.816037Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1.5, 2.5, 4.5, 3.5],\n",
       "       [7. , 6. , 4. , 3. ]])"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.hstack([a, b]) + v[:, np.newaxis]  # equivalently, we can add an axis"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Working on subset of the elements\n",
    "\n",
    "We have two ways in order to apply operations on subparts of arrays (besides slicing).\n",
    "\n",
    "#### Slicing reminders"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:27.819283Z",
     "iopub.status.busy": "2022-10-20T20:19:27.819080Z",
     "iopub.status.idle": "2022-10-20T20:19:27.840564Z",
     "shell.execute_reply": "2022-10-20T20:19:27.839972Z"
    }
   },
   "outputs": [],
   "source": [
    "r = np.random.randint(0, 9, size=(3, 4))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:27.843519Z",
     "iopub.status.busy": "2022-10-20T20:19:27.843338Z",
     "iopub.status.idle": "2022-10-20T20:19:27.861701Z",
     "shell.execute_reply": "2022-10-20T20:19:27.861242Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[4, 2, 2, 0],\n",
       "       [7, 3, 2, 8],\n",
       "       [5, 4, 8, 6]])"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "r"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:27.864467Z",
     "iopub.status.busy": "2022-10-20T20:19:27.864280Z",
     "iopub.status.idle": "2022-10-20T20:19:27.882410Z",
     "shell.execute_reply": "2022-10-20T20:19:27.881904Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([4, 2, 2, 0]), array([7, 3, 2, 8]))"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "r[0], r[1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:27.884923Z",
     "iopub.status.busy": "2022-10-20T20:19:27.884756Z",
     "iopub.status.idle": "2022-10-20T20:19:27.903215Z",
     "shell.execute_reply": "2022-10-20T20:19:27.902681Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[4, 2, 2, 0],\n",
       "       [7, 3, 2, 8]])"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "r[0:2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:27.905901Z",
     "iopub.status.busy": "2022-10-20T20:19:27.905710Z",
     "iopub.status.idle": "2022-10-20T20:19:27.924157Z",
     "shell.execute_reply": "2022-10-20T20:19:27.923650Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "np.int64(2)"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "r[1][2]  # regular python"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:27.926878Z",
     "iopub.status.busy": "2022-10-20T20:19:27.926693Z",
     "iopub.status.idle": "2022-10-20T20:19:27.944563Z",
     "shell.execute_reply": "2022-10-20T20:19:27.944076Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "np.int64(2)"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "r[1, 2]  # numpy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:27.947168Z",
     "iopub.status.busy": "2022-10-20T20:19:27.946980Z",
     "iopub.status.idle": "2022-10-20T20:19:27.965581Z",
     "shell.execute_reply": "2022-10-20T20:19:27.965114Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[2, 2],\n",
       "       [3, 2],\n",
       "       [4, 8]])"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "r[:, 1:3]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Binary masks\n",
    "\n",
    "Using logical operations on arrays give a binary mask. Using a binary mask as indexing acts as a filter and outputs just the very elements where the value is True. This gives a memory view of the array that can get modified."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:27.968242Z",
     "iopub.status.busy": "2022-10-20T20:19:27.968023Z",
     "iopub.status.idle": "2022-10-20T20:19:27.986798Z",
     "shell.execute_reply": "2022-10-20T20:19:27.986298Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[False, False, False, False],\n",
       "       [ True, False, False,  True],\n",
       "       [False, False,  True,  True]])"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "r > 5  # Binary element-wise result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:27.989747Z",
     "iopub.status.busy": "2022-10-20T20:19:27.989528Z",
     "iopub.status.idle": "2022-10-20T20:19:28.008215Z",
     "shell.execute_reply": "2022-10-20T20:19:28.007747Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([7, 8, 8, 6])"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "r[r > 5]  # Use the binary mask as filter"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:28.011002Z",
     "iopub.status.busy": "2022-10-20T20:19:28.010843Z",
     "iopub.status.idle": "2022-10-20T20:19:28.028377Z",
     "shell.execute_reply": "2022-10-20T20:19:28.027669Z"
    }
   },
   "outputs": [],
   "source": [
    "r[r > 5] = 999  # Modify the corresponding values with a constant"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:28.031370Z",
     "iopub.status.busy": "2022-10-20T20:19:28.031163Z",
     "iopub.status.idle": "2022-10-20T20:19:28.052507Z",
     "shell.execute_reply": "2022-10-20T20:19:28.052024Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[  4,   2,   2,   0],\n",
       "       [999,   3,   2, 999],\n",
       "       [  5,   4, 999, 999]])"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "r"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "#### Working with indices\n",
    "\n",
    "The second way to work on subpart of arrays are through indices. Usually you'd use one array per dimension with matching indices.\n",
    "\n",
    "**WARNING** : indices are usually slower than binary masks because it is harder to be parallelized by the underlying BLAS library."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:28.055020Z",
     "iopub.status.busy": "2022-10-20T20:19:28.054853Z",
     "iopub.status.idle": "2022-10-20T20:19:28.075198Z",
     "shell.execute_reply": "2022-10-20T20:19:28.074769Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([1, 1, 2, 2]), array([0, 3, 2, 3]))"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Get the indices where the condition is true, gives a tuple whose length\n",
    "# is the number of dimensions of the input array\n",
    "np.where(r == 999)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:28.077954Z",
     "iopub.status.busy": "2022-10-20T20:19:28.077769Z",
     "iopub.status.idle": "2022-10-20T20:19:28.099140Z",
     "shell.execute_reply": "2022-10-20T20:19:28.098340Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(array([0, 1, 2, 3, 4]),)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([0, 1, 2, 3, 4])"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print(np.where(np.arange(10) < 5))  # Is a 1-tuple\n",
    "np.where(np.arange(10) < 5)[0]  # Accessing the first element gives the indices array"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:28.102013Z",
     "iopub.status.busy": "2022-10-20T20:19:28.101775Z",
     "iopub.status.idle": "2022-10-20T20:19:28.121611Z",
     "shell.execute_reply": "2022-10-20T20:19:28.120995Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1004, 1002, 1002, 1000],\n",
       "       [ -10, 1003, 1002,  -10],\n",
       "       [1005, 1004,  -10,  -10]])"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.where(\n",
    "    r == 999, -10, r + 1000\n",
    ")  # Ternary condition, if True take element from first array, otherwise from second"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:28.124114Z",
     "iopub.status.busy": "2022-10-20T20:19:28.123923Z",
     "iopub.status.idle": "2022-10-20T20:19:28.142658Z",
     "shell.execute_reply": "2022-10-20T20:19:28.142143Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([  2, 999])"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "r[\n",
    "    (np.array([1, 2]), np.array([2, 2]))\n",
    "]  # Gets the view corresponding to the indices. NB : iterable of arrays as indexing"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Working with arrays, examples\n",
    "\n",
    "Thanks to all these tools, you should be able to avoid writing almost any for-loops which are extremely costly in Python (even more than in Matlab, because good JIT engines are yet to come). In case you **really** need for-loops for array computation (usually not needed but it happens) have a look at http://numba.pydata.org/ (_For advanced users_)\n",
    "\n",
    "#### Counting the number of positive elements that satisfy a condition"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:28.145321Z",
     "iopub.status.busy": "2022-10-20T20:19:28.145129Z",
     "iopub.status.idle": "2022-10-20T20:19:28.189004Z",
     "shell.execute_reply": "2022-10-20T20:19:28.187982Z"
    }
   },
   "outputs": [],
   "source": [
    "numbers = np.random.randn(1000, 1000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:28.191921Z",
     "iopub.status.busy": "2022-10-20T20:19:28.191711Z",
     "iopub.status.idle": "2022-10-20T20:19:43.589805Z",
     "shell.execute_reply": "2022-10-20T20:19:43.589198Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "48.9 ms ± 808 μs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n"
     ]
    }
   ],
   "source": [
    "%%timeit  # Naive version\n",
    "my_sum = 0\n",
    "for n in numbers.ravel():\n",
    "    if n > 0:\n",
    "        my_sum += 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:43.593044Z",
     "iopub.status.busy": "2022-10-20T20:19:43.592841Z",
     "iopub.status.idle": "2022-10-20T20:19:51.758953Z",
     "shell.execute_reply": "2022-10-20T20:19:51.758390Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "510 μs ± 1.39 μs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)\n"
     ]
    }
   ],
   "source": [
    "%timeit np.sum(numbers > 0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Compute polynomial for a lot of values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:51.761595Z",
     "iopub.status.busy": "2022-10-20T20:19:51.761390Z",
     "iopub.status.idle": "2022-10-20T20:19:51.779107Z",
     "shell.execute_reply": "2022-10-20T20:19:51.778492Z"
    }
   },
   "outputs": [],
   "source": [
    "X = np.random.randn(10000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:51.781870Z",
     "iopub.status.busy": "2022-10-20T20:19:51.781676Z",
     "iopub.status.idle": "2022-10-20T20:19:59.133725Z",
     "shell.execute_reply": "2022-10-20T20:19:59.133241Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2.98 ms ± 18.3 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n"
     ]
    }
   ],
   "source": [
    "%%timeit  # Naive version\n",
    "my_result = np.zeros(len(X))\n",
    "for i, x in enumerate(X.ravel()):\n",
    "    my_result[i] = 1 + x + x**2 + x**3 + x**4"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:19:59.136408Z",
     "iopub.status.busy": "2022-10-20T20:19:59.136239Z",
     "iopub.status.idle": "2022-10-20T20:20:02.767118Z",
     "shell.execute_reply": "2022-10-20T20:20:02.766589Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "209 μs ± 916 ns per loop (mean ± std. dev. of 7 runs, 1,000 loops each)\n"
     ]
    }
   ],
   "source": [
    "%timeit 1 + X + X**2 + X**3 + X**4"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## SciPy\n",
    "\n",
    "SciPy is a collection of libraries more specialized than Numpy. It is the equivalent of toolboxes in Matlab.\n",
    "\n",
    "Have a look at their collection: http://docs.scipy.org/doc/scipy/reference/\n",
    "\n",
    "Many traditionnal functions are coded there."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:20:02.770509Z",
     "iopub.status.busy": "2022-10-20T20:20:02.770320Z",
     "iopub.status.idle": "2022-10-20T20:20:02.788056Z",
     "shell.execute_reply": "2022-10-20T20:20:02.787149Z"
    }
   },
   "outputs": [],
   "source": [
    "X = np.random.randn(1000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-10-20T20:20:02.790929Z",
     "iopub.status.busy": "2022-10-20T20:20:02.790763Z",
     "iopub.status.idle": "2022-10-20T20:20:03.148198Z",
     "shell.execute_reply": "2022-10-20T20:20:03.147769Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x11914ad50>]"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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Nn/xi19k4pEiya233mp269bNfOONN8zVq1ebL774otmpUyfz3nvvTV1D9eyPN99807zuuuvMl19+2QRgvvLKK7bzOuq1rq7OrKioMM8880xzyZIl5nPPPWeWlJSYjzzySKCyk6DC4OCDDzYnTpyY+t3S0mL27t3bnDx5cgZLld1s2rTJBGDOnDnTNE3T3LZtm1lQUGC++OKLqWu++OILE4A5e/Zs0zQTH1YsFjNrampS1zz00ENmaWmp2dDQkN4HiDjbt283Bw8ebE6bNs38wQ9+kBJUqJ71cM0115iHH34493w8HjcrKyvNO++8M3Vs27ZtZlFRkfncc8+Zpmmay5YtMwGY8+bNS13z1ltvmYZhmOvXrw+v8FnEhAkTzF//+te2Y6eeeqp55plnmqZJ9awLp6Ciq14ffPBBs0uXLrZ+45prrjGHDBkSqLxk+nHQ2NiI+fPnY9y4caljsVgM48aNw+zZszNYsuymrq4OANC1a1cAwPz589HU1GSr56FDh6Jfv36pep49ezaGDx+OioqK1DXjx49HfX09li5dmsbSR5+JEydiwoQJtvoEqJ518d///hdjxozB6aefjp49e2LUqFF47LHHUudXr16NmpoaWz2XlZVh7NixtnouLy/HmDFjUteMGzcOsVgMc+bMSd/DRJhDDz0U06dPx8qVKwEAixYtwocffogTTzwRANVzWOiq19mzZ+PII49EYWFh6prx48djxYoV2Lp1q+/yZf2mhLrZvHkzWlpabJ02AFRUVGD58uUZKlV2E4/Hcdlll+Gwww7D/vvvDwCoqalBYWEhysvLbddWVFSgpqYmdQ3rPSTPEQmef/55fPbZZ5g3b57rHNWzHr7++ms89NBDuOKKK/CHP/wB8+bNw+9//3sUFhbinHPOSdUTqx6t9dyzZ0/b+fz8fHTt2pXquZVrr70W9fX1GDp0KPLy8tDS0oJbb70VZ555JgBQPYeErnqtqanBwIEDXWkkz3Xp0sVX+UhQIUJn4sSJWLJkCT788MNMF6XdsW7dOlx66aWYNm0aiouLM12cdks8HseYMWNw2223AQBGjRqFJUuW4OGHH8Y555yT4dK1H/7973/jmWeewbPPPov99tsPCxcuxGWXXYbevXtTPecwZPpx0L17d+Tl5blWRdTW1qKysjJDpcpeLrnkErzxxht477330Ldv39TxyspKNDY2Ytu2bbbrrfVcWVnJfA/Jc0TCtLNp0yYceOCByM/PR35+PmbOnIn77rsP+fn5qKiooHrWQK9evTBs2DDbsX333Rdr164F0FZPon6jsrISmzZtsp1vbm7Gli1bqJ5bueqqq3DttdfijDPOwPDhw3HWWWfh8ssvx+TJkwFQPYeFrnoNqy8hQcVBYWEhRo8ejenTp6eOxeNxTJ8+HdXV1RksWXZhmiYuueQSvPLKK5gxY4ZLHTh69GgUFBTY6nnFihVYu3Ztqp6rq6uxePFi28cxbdo0lJaWugaNXOXYY4/F4sWLsXDhwtS/MWPG4Mwzz0z9TfUcnMMOO8y1vH7lypXo378/AGDgwIGorKy01XN9fT3mzJljq+dt27Zh/vz5qWtmzJiBeDyOsWPHpuEpos+uXbsQi9mHpby8PMTjcQBUz2Ghq16rq6vxwQcfoKmpKXXNtGnTMGTIEN9mHwC0PJnF888/bxYVFZlPPPGEuWzZMvPCCy80y8vLbasiCDEXX3yxWVZWZr7//vvmxo0bU/927dqVuuaiiy4y+/XrZ86YMcP89NNPzerqarO6ujp1Prls9vjjjzcXLlxoTp061ezRowctm/XAuurHNKmedTB37lwzPz/fvPXWW80vv/zSfOaZZ8wOHTqYTz/9dOqa22+/3SwvLzdfe+018/PPPzdPPvlk5vLOUaNGmXPmzDE//PBDc/DgwTm/bNbKOeecY/bp0ye1PPnll182u3fvbl599dWpa6ie/bF9+3ZzwYIF5oIFC0wA5l133WUuWLDA/Oabb0zT1FOv27ZtMysqKsyzzjrLXLJkifn888+bHTp0oOXJYXH//feb/fr1MwsLC82DDz7Y/OSTTzJdpKwCAPPflClTUtfs3r3b/H//7/+ZXbp0MTt06GD+5Cc/MTdu3GhLZ82aNeaJJ55olpSUmN27dzevvPJKs6mpKc1Pk104BRWqZz28/vrr5v77728WFRWZQ4cONR999FHb+Xg8bt5www1mRUWFWVRUZB577LHmihUrbNd8//335i9+8QuzU6dOZmlpqXneeeeZ27dvT+djRJr6+nrz0ksvNfv162cWFxebgwYNMq+77jrbcleqZ3+89957zD75nHPOMU1TX70uWrTIPPzww82ioiKzT58+5u233x647IZpWkL+EQRBEARBRAjyUSEIgiAIIrKQoEIQBEEQRGQhQYUgCIIgiMhCggpBEARBEJGFBBWCIAiCICILCSoEQRAEQUQWElQIgiAIgogsJKgQBEEQBBFZSFAhCIIgCCKykKBCEARBEERkIUGFIAiCIIjIQoIKQRAEQRCR5f8DYHswiWDI4YkAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from scipy.fftpack import fft\n",
    "\n",
    "plt.plot(fft(X).real)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
