{"nbformat":4,"nbformat_minor":0,"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.6.8"},"colab":{"name":"numpy_tutorial.ipynb","provenance":[{"file_id":"1eJHjSJOUnbocSAm7C_iAoCkp4bQaAzQm","timestamp":1632208758280}]}},"cells":[{"cell_type":"markdown","metadata":{"id":"dFNdllcVKEO9"},"source":["# Numpy -  basic tutorial\n","Adapted from the tutorial by: J.R. Johansson\n","\n","Author: Giovanni Piccioli"]},{"cell_type":"markdown","metadata":{"id":"gb96jw9OKEPB"},"source":[" [Official quickstart guide](https://numpy.org/doc/stable/user/quickstart.html)\n"," \n"," [Official documentation](https://numpy.org/doc/1.21/)"]},{"cell_type":"markdown","metadata":{"id":"3LnkQPNTKEPC"},"source":["## Importing the library"]},{"cell_type":"markdown","metadata":{"id":"9voWSoTfKEPC"},"source":["To use `numpy` you need to import the module, using for example:"]},{"cell_type":"code","metadata":{"collapsed":true,"id":"gYj8L0a_KEPD"},"source":["import numpy as np\n","import matplotlib.pyplot as plt"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"EYXGKgU6KEPD"},"source":["In the `numpy` package the terminology used for vectors, matrices and higher-dimensional data sets is *array*. "]},{"cell_type":"markdown","metadata":{"id":"xUPTIJsuKEPE"},"source":["## Creating `numpy` arrays"]},{"cell_type":"markdown","metadata":{"id":"NEn5tQo2KEPE"},"source":["### From lists"]},{"cell_type":"markdown","metadata":{"id":"i3vwog8KKEPF"},"source":["For example, to create new vector and matrix arrays from Python lists we can use the `numpy.array` function."]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"JCiRxc4DKEPF","executionInfo":{"status":"ok","timestamp":1632239070406,"user_tz":-120,"elapsed":203,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"819980d3-d384-4f9d-e0db-a0995cefcd8b"},"source":["# a vector: the argument to the array function is a Python list\n","v = np.array([1,2,3,4])\n","\n","v"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([1, 2, 3, 4])"]},"metadata":{},"execution_count":2}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"nS5Q9bdnKEPG","executionInfo":{"status":"ok","timestamp":1632239071309,"user_tz":-120,"elapsed":5,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"963a4991-4d47-44d3-83bb-e1014a473ba3"},"source":["# a matrix: the argument to the array function is a nested Python list\n","M = np.array([[1, 2], [3, 4]])\n","\n","M"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[1, 2],\n","       [3, 4]])"]},"metadata":{},"execution_count":3}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"30B-grQOQoGM","executionInfo":{"status":"ok","timestamp":1632239072281,"user_tz":-120,"elapsed":4,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"9e5aaa68-bdba-4021-e09f-c0e7c6d43100"},"source":["np.zeros([3,2])"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[0., 0.],\n","       [0., 0.],\n","       [0., 0.]])"]},"metadata":{},"execution_count":4}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"SWkZFO3gRAUT","executionInfo":{"status":"ok","timestamp":1632239077850,"user_tz":-120,"elapsed":4533,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"73fa98d7-0f1f-4d2f-bbce-d2a18bbf785f"},"source":["np.ones([2,3])"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[1., 1., 1.],\n","       [1., 1., 1.]])"]},"metadata":{},"execution_count":5}]},{"cell_type":"markdown","metadata":{"id":"oX9DllBwKEPG"},"source":["The `v` and `M` objects are both of the type `ndarray` that the `numpy` module provides."]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"doHEJ_o7KEPH","executionInfo":{"status":"ok","timestamp":1632239087525,"user_tz":-120,"elapsed":232,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"b26f8f7b-a511-45bf-b346-9da6579f17d0"},"source":["type(v), type(M)"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["(numpy.ndarray, numpy.ndarray)"]},"metadata":{},"execution_count":6}]},{"cell_type":"markdown","metadata":{"id":"wr8wFpsTKEPH"},"source":["The difference between the `v` and `M` arrays is only their shapes. We can get information about the shape of an array by using the `ndarray.shape` property.\n","\n","The number of elements in the array is available through the `ndarray.size` property"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"TL1G9mEWKEPH","executionInfo":{"status":"ok","timestamp":1632239089320,"user_tz":-120,"elapsed":205,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"c0372505-016f-4cf4-dd7c-ac2c54383079"},"source":["print(v.shape)\n","print(np.shape(v))\n","print(v.size)\n","print(np.size(v))"],"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["(4,)\n","(4,)\n","4\n","4\n"]}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"Efl8zBLGKEPI","executionInfo":{"status":"ok","timestamp":1632239090262,"user_tz":-120,"elapsed":5,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"ab404a03-faf4-4bd2-90c9-5f6a43616d71"},"source":["print(M.shape) \n","print(np.shape(M))\n","print(M.size)\n","print(np.size(M))"],"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["(2, 2)\n","(2, 2)\n","4\n","4\n"]}]},{"cell_type":"markdown","metadata":{"id":"nAzXr0lTKEPJ"},"source":["Using the `dtype` (data type) property of an `ndarray`, we can see what type the data of an array has:\n"," "]},{"cell_type":"code","metadata":{"id":"_RRRSgz6KEPJ","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239092009,"user_tz":-120,"elapsed":219,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"306f2fa5-6a12-4cd9-99ae-2876f41d10ff"},"source":["M.dtype"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["dtype('int64')"]},"metadata":{},"execution_count":9}]},{"cell_type":"markdown","metadata":{"id":"F9ruEzOsKEPJ"},"source":["<img width=40px src='images/help.png' style=\"display:inline-block;\"/> <b>numpy-ref-1.15.1.pdf</b> pag. 62<br>\n","\n","We get an error if we try to assign a value of the wrong type to an element in a numpy array:"]},{"cell_type":"code","metadata":{"id":"9Kioqi52KEPK","colab":{"base_uri":"https://localhost:8080/","height":164},"executionInfo":{"status":"error","timestamp":1632239093635,"user_tz":-120,"elapsed":198,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"884c10fd-997d-430f-d1a3-b822ff517bf4"},"source":["M[0,0] = \"hello\""],"execution_count":null,"outputs":[{"output_type":"error","ename":"ValueError","evalue":"ignored","traceback":["\u001b[0;31m---------------------------------------------------------------------------\u001b[0m","\u001b[0;31mValueError\u001b[0m                                Traceback (most recent call last)","\u001b[0;32m<ipython-input-10-e1f336250f69>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mM\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\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\"hello\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m","\u001b[0;31mValueError\u001b[0m: invalid literal for int() with base 10: 'hello'"]}]},{"cell_type":"markdown","metadata":{"id":"Rgf4nqXKKEPK"},"source":["### Generating functions"]},{"cell_type":"markdown","metadata":{"id":"AaUBLMa4KEPK"},"source":["#### arange"]},{"cell_type":"code","metadata":{"id":"3aqC1DStKEPL","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239103872,"user_tz":-120,"elapsed":213,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"b85d15f6-40b1-4ab6-f717-2a882ba5e0c0"},"source":["# create a range\n","\n","x = np.arange(0, 10, 1) # arguments: start, stop, step\n","\n","x"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])"]},"metadata":{},"execution_count":11}]},{"cell_type":"code","metadata":{"id":"egDDjuoZKEPL","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239104647,"user_tz":-120,"elapsed":4,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"dc4d4c06-d37b-412c-af27-1b0a713b61e3"},"source":["x = np.arange(-1, 1, 0.1)\n","\n","x"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([-1.00000000e+00, -9.00000000e-01, -8.00000000e-01, -7.00000000e-01,\n","       -6.00000000e-01, -5.00000000e-01, -4.00000000e-01, -3.00000000e-01,\n","       -2.00000000e-01, -1.00000000e-01, -2.22044605e-16,  1.00000000e-01,\n","        2.00000000e-01,  3.00000000e-01,  4.00000000e-01,  5.00000000e-01,\n","        6.00000000e-01,  7.00000000e-01,  8.00000000e-01,  9.00000000e-01])"]},"metadata":{},"execution_count":12}]},{"cell_type":"markdown","metadata":{"id":"V5m_TUIAKEPL"},"source":["#### linspace, logspace and geomspace"]},{"cell_type":"code","metadata":{"id":"6XwQNpsuKEPL","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239106387,"user_tz":-120,"elapsed":237,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"973fc275-0f07-4975-e71d-2bb6dd524f32"},"source":["# using linspace, both end points ARE included\n","np.linspace(0, 10, 25)"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([ 0.        ,  0.41666667,  0.83333333,  1.25      ,  1.66666667,\n","        2.08333333,  2.5       ,  2.91666667,  3.33333333,  3.75      ,\n","        4.16666667,  4.58333333,  5.        ,  5.41666667,  5.83333333,\n","        6.25      ,  6.66666667,  7.08333333,  7.5       ,  7.91666667,\n","        8.33333333,  8.75      ,  9.16666667,  9.58333333, 10.        ])"]},"metadata":{},"execution_count":13}]},{"cell_type":"code","metadata":{"id":"WTcElF4fKEPL","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239107943,"user_tz":-120,"elapsed":214,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"c94961a4-0eb5-4040-8bd6-0bbe7f4fab32"},"source":["print(np.logspace(0, 10, 10, base=np.e))# from e^0 to e^10 with exponents evenly spaced\n","print(np.exp(np.linspace(0,10,10)))\n","print(np.geomspace(1,np.e**10,10)) "],"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["[1.00000000e+00 3.03773178e+00 9.22781435e+00 2.80316249e+01\n"," 8.51525577e+01 2.58670631e+02 7.85771994e+02 2.38696456e+03\n"," 7.25095809e+03 2.20264658e+04]\n","[1.00000000e+00 3.03773178e+00 9.22781435e+00 2.80316249e+01\n"," 8.51525577e+01 2.58670631e+02 7.85771994e+02 2.38696456e+03\n"," 7.25095809e+03 2.20264658e+04]\n","[1.00000000e+00 3.03773178e+00 9.22781435e+00 2.80316249e+01\n"," 8.51525577e+01 2.58670631e+02 7.85771994e+02 2.38696456e+03\n"," 7.25095809e+03 2.20264658e+04]\n"]}]},{"cell_type":"markdown","metadata":{"id":"9mfVZNz1KEPM"},"source":["## Random data\n"]},{"cell_type":"code","metadata":{"collapsed":true,"id":"jG8bml2xKEPM"},"source":["from numpy import random"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"xXvEnAldRQCr"},"source":["np.random.seed(123) #initializing the rng"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"k7ui2YVMKEPM","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239114577,"user_tz":-120,"elapsed":5,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"f49833a3-144c-45a6-ea1b-793504fb6c82"},"source":["# uniform random numbers in [0,1]\n","random.rand(5,5) "],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[0.69646919, 0.28613933, 0.22685145, 0.55131477, 0.71946897],\n","       [0.42310646, 0.9807642 , 0.68482974, 0.4809319 , 0.39211752],\n","       [0.34317802, 0.72904971, 0.43857224, 0.0596779 , 0.39804426],\n","       [0.73799541, 0.18249173, 0.17545176, 0.53155137, 0.53182759],\n","       [0.63440096, 0.84943179, 0.72445532, 0.61102351, 0.72244338]])"]},"metadata":{},"execution_count":17}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":367},"id":"S6rjO_MSOAWj","executionInfo":{"status":"ok","timestamp":1632239115784,"user_tz":-120,"elapsed":345,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"94a01751-865c-4532-fd07-c84d7366185b"},"source":["plt.hist(random.rand(10000))"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["(array([ 986., 1084.,  989.,  939.,  971., 1019., 1008., 1044., 1003.,\n","         957.]),\n"," array([6.78383123e-05, 1.00050061e-01, 2.00032284e-01, 3.00014506e-01,\n","        3.99996729e-01, 4.99978951e-01, 5.99961174e-01, 6.99943397e-01,\n","        7.99925619e-01, 8.99907842e-01, 9.99890065e-01]),\n"," <a list of 10 Patch objects>)"]},"metadata":{},"execution_count":18},{"output_type":"display_data","data":{"image/png":"iVBORw0KGgoAAAANSUhEUgAAAX0AAAD4CAYAAAAAczaOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAPHElEQVR4nO3cf4xmVX3H8fdHVrT+KL92SujutkMjtiU2jWSiGBNrXWMAG5akSjC1rGTTTSy1Vkzrtv2DRv+BtJVKarBbl7o0lkKpKZtKawg/Qtp0iYNY5EctUxTY7SKjwvYHsUr99o/noCPdZZ+ZO/sMD+f9SiZz7rnnueecndnP3Ofc+9xUFZKkPrxorQcgSZocQ1+SOmLoS1JHDH1J6oihL0kdWbfWA3gu69evr9nZ2bUehiRNlbvuuuvrVTVzqH3P69CfnZ1lfn5+rYchSVMlycOH2+fyjiR1xNCXpI4Y+pLUEUNfkjpi6EtSRwx9SeqIoS9JHTH0Jakjhr4kdeR5/YncaTW747Nr0u9XL3v7mvQraXp4pi9JHTH0Jakjhr4kdcTQl6SOGPqS1BFDX5I64i2bksbm7cjTzzN9SeqIoS9JHTH0Jakjhr4kdcQLudIKeVFT0+iIZ/pJrk7yeJJ7l9SdmOTmJA+27ye0+iS5MslCknuSnLHkNVtb+weTbD0605EkPZdxzvQ/BfwxcM2Suh3ALVV1WZIdbftDwNnAae3r9cBVwOuTnAhcCswBBdyVZE9VPbFaE5F6sVbvMPTCcMTQr6o7ksw+q3oL8OZW3g3czij0twDXVFUBe5Mcn+SU1vbmqvomQJKbgbOAawfPQNILnktpq2elF3JPrqoDrfwYcHIrbwAeXdJuX6s7XP3/k2R7kvkk84uLiyscniTpUAbfvdPO6msVxvLM8XZW1VxVzc3MzKzWYSVJrPzuna8lOaWqDrTlm8db/X5g05J2G1vdfr6/HPRM/e0r7Htsva19ruV8X4hvg6UXopWe6e8BnrkDZytw45L6C9tdPGcCB9sy0OeAtyU5od3p87ZWJ0maoCOe6Se5ltFZ+vok+xjdhXMZcH2SbcDDwPmt+U3AOcAC8BRwEUBVfTPJR4DPt3YffuairiRpcsa5e+ddh9m1+RBtC7j4MMe5Grh6WaOTjqC3JTxpKB/DIEkdMfQlqSM+e0eSDuOFeEecZ/qS1BFDX5I64vKOVoV30UjTwTN9SeqIoS9JHTH0Jakjhr4kdcTQl6SOGPqS1BFDX5I6YuhLUkcMfUnqiKEvSR0x9CWpI4a+JHXE0Jekjhj6ktQRQ1+SOmLoS1JHDH1J6oihL0kdMfQlqSOGviR1xNCXpI4Y+pLUEUNfkjoyKPSTfCDJfUnuTXJtkpcmOTXJnUkWklyX5NjW9iVte6Htn12NCUiSxrfi0E+yAfh1YK6qXgMcA1wAXA5cUVWvAp4AtrWXbAOeaPVXtHaSpAkauryzDvihJOuAlwEHgLcAN7T9u4HzWnlL26bt35wkA/uXJC3DikO/qvYDfwA8wijsDwJ3AU9W1dOt2T5gQytvAB5tr326tT/p2cdNsj3JfJL5xcXFlQ5PknQIQ5Z3TmB09n4q8KPAy4Gzhg6oqnZW1VxVzc3MzAw9nCRpiSHLO28FvlJVi1X1HeAzwBuB49tyD8BGYH8r7wc2AbT9xwHfGNC/JGmZhoT+I8CZSV7W1uY3A/cDtwHvaG22Aje28p62Tdt/a1XVgP4lScs0ZE3/TkYXZL8AfKkdayfwIeCSJAuM1ux3tZfsAk5q9ZcAOwaMW5K0AuuO3OTwqupS4NJnVT8EvO4Qbb8FvHNIf5KkYfxEriR1xNCXpI4Y+pLUEUNfkjpi6EtSRwx9SeqIoS9JHTH0Jakjhr4kdcTQl6SOGPqS1BFDX5I6YuhLUkcMfUnqiKEvSR0x9CWpI4a+JHXE0Jekjhj6ktQRQ1+SOmLoS1JHDH1J6oihL0kdMfQlqSOGviR1xNCXpI4Y+pLUEUNfkjpi6EtSRwaFfpLjk9yQ5F+SPJDkDUlOTHJzkgfb9xNa2yS5MslCknuSnLE6U5AkjWvomf7HgL+vqp8CfhZ4ANgB3FJVpwG3tG2As4HT2td24KqBfUuSlmnFoZ/kOOBNwC6Aqvp2VT0JbAF2t2a7gfNaeQtwTY3sBY5PcsqKRy5JWrYhZ/qnAovAnyW5O8knk7wcOLmqDrQ2jwEnt/IG4NElr9/X6n5Aku1J5pPMLy4uDhieJOnZhoT+OuAM4Kqqei3w33x/KQeAqiqglnPQqtpZVXNVNTczMzNgeJKkZxsS+vuAfVV1Z9u+gdEfga89s2zTvj/e9u8HNi15/cZWJ0makBWHflU9Bjya5Cdb1WbgfmAPsLXVbQVubOU9wIXtLp4zgYNLloEkSROwbuDr3wd8OsmxwEPARYz+kFyfZBvwMHB+a3sTcA6wADzV2kqSJmhQ6FfVF4G5Q+zafIi2BVw8pD9J0jB+IleSOmLoS1JHDH1J6oihL0kdMfQlqSOGviR1xNCXpI4Y+pLUEUNfkjpi6EtSRwx9SeqIoS9JHTH0Jakjhr4kdcTQl6SOGPqS1BFDX5I6YuhLUkcMfUnqiKEvSR0x9CWpI4a+JHXE0Jekjhj6ktQRQ1+SOmLoS1JHDH1J6oihL0kdMfQlqSODQz/JMUnuTvK3bfvUJHcmWUhyXZJjW/1L2vZC2z87tG9J0vKsxpn++4EHlmxfDlxRVa8CngC2tfptwBOt/orWTpI0QYNCP8lG4O3AJ9t2gLcAN7Qmu4HzWnlL26bt39zaS5ImZOiZ/h8BvwV8t22fBDxZVU+37X3AhlbeADwK0PYfbO1/QJLtSeaTzC8uLg4cniRpqRWHfpJfAB6vqrtWcTxU1c6qmququZmZmdU8tCR1b92A174RODfJOcBLgR8GPgYcn2RdO5vfCOxv7fcDm4B9SdYBxwHfGNC/JGmZVnymX1W/XVUbq2oWuAC4tap+CbgNeEdrthW4sZX3tG3a/lurqlbavyRp+Y7GffofAi5JssBozX5Xq98FnNTqLwF2HIW+JUnPYcjyzvdU1e3A7a38EPC6Q7T5FvDO1ehPkrQyfiJXkjpi6EtSRwx9SeqIoS9JHTH0Jakjhr4kdcTQl6SOGPqS1BFDX5I6YuhLUkcMfUnqiKEvSR0x9CWpI4a+JHXE0Jekjhj6ktQRQ1+SOmLoS1JHDH1J6oihL0kdMfQlqSOGviR1xNCXpI4Y+pLUEUNfkjpi6EtSRwx9SeqIoS9JHTH0JakjKw79JJuS3Jbk/iT3JXl/qz8xyc1JHmzfT2j1SXJlkoUk9yQ5Y7UmIUkaz5Az/aeBD1bV6cCZwMVJTgd2ALdU1WnALW0b4GzgtPa1HbhqQN+SpBVYcehX1YGq+kIr/yfwALAB2ALsbs12A+e18hbgmhrZCxyf5JQVj1yStGyrsqafZBZ4LXAncHJVHWi7HgNObuUNwKNLXrav1UmSJmRw6Cd5BfDXwG9U1X8s3VdVBdQyj7c9yXyS+cXFxaHDkyQtMSj0k7yYUeB/uqo+06q/9syyTfv+eKvfD2xa8vKNre4HVNXOqpqrqrmZmZkhw5MkPcuQu3cC7AIeqKqPLtm1B9jayluBG5fUX9ju4jkTOLhkGUiSNAHrBrz2jcAvA19K8sVW9zvAZcD1SbYBDwPnt303AecAC8BTwEUD+pYkrcCKQ7+q/gHIYXZvPkT7Ai5eaX+SpOH8RK4kdcTQl6SOGPqS1BFDX5I6YuhLUkcMfUnqiKEvSR0x9CWpI4a+JHXE0Jekjhj6ktQRQ1+SOmLoS1JHDH1J6oihL0kdMfQlqSOGviR1xNCXpI4Y+pLUEUNfkjpi6EtSRwx9SeqIoS9JHTH0Jakjhr4kdcTQl6SOGPqS1BFDX5I6YuhLUkcMfUnqyMRDP8lZSb6cZCHJjkn3L0k9m2joJzkG+DhwNnA68K4kp09yDJLUs0mf6b8OWKiqh6rq28BfAlsmPAZJ6ta6Cfe3AXh0yfY+4PVLGyTZDmxvm/+V5MsD+lsPfH3A66dNb/MF59yL7uacywfN+ccPt2PSoX9EVbUT2Lkax0oyX1Vzq3GsadDbfME598I5r55JL+/sBzYt2d7Y6iRJEzDp0P88cFqSU5McC1wA7JnwGCSpWxNd3qmqp5P8GvA54Bjg6qq67yh2uSrLRFOkt/mCc+6Fc14lqaqjcVxJ0vOQn8iVpI4Y+pLUkakP/SM91iHJS5Jc1/bfmWR28qNcXWPM+ZIk9ye5J8ktSQ57z+60GPfxHUl+MUklmfrb+8aZc5Lz28/6viR/MekxrrYxfrd/LMltSe5uv9/nrMU4V0uSq5M8nuTew+xPkivbv8c9Sc4Y3GlVTe0Xo4vB/wb8BHAs8M/A6c9q86vAJ1r5AuC6tR73BOb888DLWvm9Pcy5tXslcAewF5hb63FP4Od8GnA3cELb/pG1HvcE5rwTeG8rnw58da3HPXDObwLOAO49zP5zgL8DApwJ3Dm0z2k/0x/nsQ5bgN2tfAOwOUkmOMbVdsQ5V9VtVfVU29zL6PMQ02zcx3d8BLgc+NYkB3eUjDPnXwE+XlVPAFTV4xMe42obZ84F/HArHwf8+wTHt+qq6g7gm8/RZAtwTY3sBY5PcsqQPqc99A/1WIcNh2tTVU8DB4GTJjK6o2OcOS+1jdGZwjQ74pzb295NVfXZSQ7sKBrn5/xq4NVJ/jHJ3iRnTWx0R8c4c/494N1J9gE3Ae+bzNDWzHL/vx/R8+4xDFo9Sd4NzAE/t9ZjOZqSvAj4KPCeNR7KpK1jtMTzZkbv5u5I8jNV9eSajuroehfwqar6wyRvAP48yWuq6rtrPbBpMe1n+uM81uF7bZKsY/SW8BsTGd3RMdajLJK8Ffhd4Nyq+p8Jje1oOdKcXwm8Brg9yVcZrX3umfKLueP8nPcBe6rqO1X1FeBfGf0RmFbjzHkbcD1AVf0T8FJGD2N7oVr1R9dMe+iP81iHPcDWVn4HcGu1KyRT6ohzTvJa4E8YBf60r/PCEeZcVQeran1VzVbVLKPrGOdW1fzaDHdVjPO7/TeMzvJJsp7Rcs9DkxzkKhtnzo8AmwGS/DSj0F+c6Cgnaw9wYbuL50zgYFUdGHLAqV7eqcM81iHJh4H5qtoD7GL0FnCB0QWTC9ZuxMONOeffB14B/FW7Zv1IVZ27ZoMeaMw5v6CMOefPAW9Lcj/wv8BvVtXUvosdc84fBP40yQcYXdR9zzSfxCW5ltEf7vXtOsWlwIsBquoTjK5bnAMsAE8BFw3uc4r/vSRJyzTtyzuSpGUw9CWpI4a+JHXE0Jekjhj6ktQRQ1+SOmLoS1JH/g8he+/D4WrW1AAAAABJRU5ErkJggg==\n","text/plain":["<Figure size 432x288 with 1 Axes>"]},"metadata":{"needs_background":"light"}}]},{"cell_type":"code","metadata":{"id":"AEFbXLNmKEPM","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239116621,"user_tz":-120,"elapsed":4,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"6403cc5f-e913-4eaf-e9d6-9363ca740b37"},"source":["# standard normal distributed random numbers\n","random.randn(5,5)"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[-0.51062288,  1.35793809, -0.11346956, -0.21011913,  0.34878086],\n","       [-0.51088706, -0.38192367,  0.70181157,  3.04640543, -0.05460617],\n","       [ 0.91544605,  0.76157638, -1.72062648, -0.49308019,  0.37392502],\n","       [-1.71184827, -1.37352589,  0.34466191,  0.46583391,  1.10557143],\n","       [ 0.75759133, -0.29262621,  1.50760545,  1.32562215,  0.32553038]])"]},"metadata":{},"execution_count":19}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":367},"id":"jIzuWL1cOswy","executionInfo":{"status":"ok","timestamp":1632239117959,"user_tz":-120,"elapsed":458,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"ea5b6d3e-8633-48c7-a63e-392e9edfb85b"},"source":["plt.hist(random.randn(100000))"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["(array([1.8000e+01, 3.1300e+02, 3.1980e+03, 1.5061e+04, 3.1608e+04,\n","        3.1564e+04, 1.4800e+04, 3.1040e+03, 3.1800e+02, 1.6000e+01]),\n"," array([-4.51285981, -3.60919645, -2.7055331 , -1.80186974, -0.89820639,\n","         0.00545696,  0.90912032,  1.81278367,  2.71644703,  3.62011038,\n","         4.52377373]),\n"," <a list of 10 Patch objects>)"]},"metadata":{},"execution_count":20},{"output_type":"display_data","data":{"image/png":"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\n","text/plain":["<Figure size 432x288 with 1 Axes>"]},"metadata":{"needs_background":"light"}}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"QCQ3wEfEjPVS","executionInfo":{"status":"ok","timestamp":1632239118682,"user_tz":-120,"elapsed":5,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"25287ab5-22c6-4d0c-ec62-9deca8d05562"},"source":["random.binomial(n=1000,p=0.5,size=[2,2])"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[507, 499],\n","       [494, 509]])"]},"metadata":{},"execution_count":21}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":333},"id":"z75Oe8P8UBgv","executionInfo":{"status":"ok","timestamp":1632239120042,"user_tz":-120,"elapsed":332,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"19feb36e-71a1-44d8-b68f-5b423291aa1f"},"source":["plt.hist(random.binomial(n=1000,p=0.5,size=[2000]))"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["(array([  2.,  14.,  70., 188., 385., 492., 476., 251., 100.,  22.]),\n"," array([441. , 451.5, 462. , 472.5, 483. , 493.5, 504. , 514.5, 525. ,\n","        535.5, 546. ]),\n"," <a list of 10 Patch objects>)"]},"metadata":{},"execution_count":22},{"output_type":"display_data","data":{"image/png":"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\n","text/plain":["<Figure size 432x288 with 1 Axes>"]},"metadata":{"needs_background":"light"}}]},{"cell_type":"markdown","metadata":{"id":"Nzb4baLgRkT5"},"source":["For more distributions see [this link](https://numpy.org/doc/1.16/reference/routines.random.html)"]},{"cell_type":"markdown","metadata":{"id":"I9leHT0EKEPN"},"source":["## Matrices"]},{"cell_type":"code","metadata":{"id":"OOJfkNpGKEPN","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239133269,"user_tz":-120,"elapsed":204,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"68c92ecc-e83c-4c64-e0c6-9c6199c909c3"},"source":["# a diagonal matrix\n","np.diag([1,2,3])"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[1, 0, 0],\n","       [0, 2, 0],\n","       [0, 0, 3]])"]},"metadata":{},"execution_count":24}]},{"cell_type":"markdown","metadata":{"id":"cWf_c05EKEPQ"},"source":["## Manipulating arrays"]},{"cell_type":"markdown","metadata":{"id":"Yw5BuEH2KEPQ"},"source":["### Indexing"]},{"cell_type":"markdown","metadata":{"id":"A9bx13EWKEPQ"},"source":["We can index elements in an array using square brackets and indices:"]},{"cell_type":"code","metadata":{"id":"WHtsYcENKEPQ","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239191352,"user_tz":-120,"elapsed":202,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"2bc45697-6b8c-43e2-dc66-4574805030d5"},"source":["# v is a vector, and has only one dimension, taking one index\n","v[0]"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["1"]},"metadata":{},"execution_count":29}]},{"cell_type":"code","metadata":{"id":"LOSAEvoeKEPQ","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239192049,"user_tz":-120,"elapsed":5,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"46aacdc0-a904-49f0-a41e-c93095b64ade"},"source":["# M is a matrix, or a 2 dimensional array, taking two indices \n","M[1,1]"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["0.056456717350173324"]},"metadata":{},"execution_count":30}]},{"cell_type":"markdown","metadata":{"id":"FZKfAGvGKEPQ"},"source":["If we omit an index of a multidimensional array it returns the whole row (or, in general, a N-1 dimensional array) "]},{"cell_type":"code","metadata":{"id":"LheBuaNCKEPR","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239194192,"user_tz":-120,"elapsed":207,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"78178ee7-9f8b-4f14-b33b-27f574c05e35"},"source":["M"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[0.50998687, 0.36497992, 0.78542134],\n","       [0.42235121, 0.05645672, 0.54462093],\n","       [0.33702889, 0.95998793, 0.32246955]])"]},"metadata":{},"execution_count":31}]},{"cell_type":"code","metadata":{"id":"ZUzksnZYKEPR","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239195360,"user_tz":-120,"elapsed":286,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"3b1d89a6-01a7-41d5-f0fe-d3304f7acfbc"},"source":["M[1]"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([0.42235121, 0.05645672, 0.54462093])"]},"metadata":{},"execution_count":32}]},{"cell_type":"markdown","metadata":{"id":"PToMsRiBKEPR"},"source":["The same thing can be achieved with using `:` instead of an index: "]},{"cell_type":"markdown","metadata":{"id":"kHZrQ5a5KEPV"},"source":["We can assign new values to elements in an array using indexing:"]},{"cell_type":"code","metadata":{"collapsed":true,"id":"efTxJOG1KEPV"},"source":["M[0,0] = 1"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"y_Ul1QymKEPV"},"source":["### Index slicing"]},{"cell_type":"markdown","metadata":{"id":"Y5p2XB3RKEPV"},"source":["Index slicing is the technical name for the syntax `M[lower:upper:step]` to extract part of an array:"]},{"cell_type":"code","metadata":{"id":"Jeb8IP_5KEPW","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239202500,"user_tz":-120,"elapsed":523,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"843ba4b6-9f14-4eb6-a545-f04fff7a240a"},"source":["A = np.array([x for x in range(20)])\n","A"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,\n","       17, 18, 19])"]},"metadata":{},"execution_count":34}]},{"cell_type":"code","metadata":{"id":"p_QrY6mWKEPW","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239203490,"user_tz":-120,"elapsed":5,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"11f8e72e-1696-4d51-a281-1c52950516ec"},"source":["A[1:3]"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([1, 2])"]},"metadata":{},"execution_count":35}]},{"cell_type":"markdown","metadata":{"id":"Qn5Ztk9YKEPW"},"source":["Array slices are *mutable*: if they are assigned a new value the original array from which the slice was extracted is modified:"]},{"cell_type":"code","metadata":{"id":"zVEUExvdKEPW","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239205187,"user_tz":-120,"elapsed":207,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"6b0058ac-3b8e-40da-e2a9-6f6c3f33f007"},"source":["A[2:15:3] # lower, upper, step all take the default values"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([ 2,  5,  8, 11, 14])"]},"metadata":{},"execution_count":36}]},{"cell_type":"code","metadata":{"id":"_G0GVWpVKEPW","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239205943,"user_tz":-120,"elapsed":5,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"69881637-1694-48f6-c441-d0017174b876"},"source":["A[1:3] = [-2,-3]\n","\n","A"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([ 0, -2, -3,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,\n","       17, 18, 19])"]},"metadata":{},"execution_count":37}]},{"cell_type":"markdown","metadata":{"id":"pvVbpUTrKEPW"},"source":["We can omit any of the three parameters in `M[lower:upper:step]`:"]},{"cell_type":"code","metadata":{"id":"3NEq6SdgKEPX","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239207672,"user_tz":-120,"elapsed":204,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"d6920b24-2ed5-414a-8c9a-6cb41f73690d"},"source":["A[:3] # first three elements"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([ 0, -2, -3])"]},"metadata":{},"execution_count":38}]},{"cell_type":"code","metadata":{"id":"NqZLypDRKEPX","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239208604,"user_tz":-120,"elapsed":236,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"0345c161-42b8-4364-b7eb-6a47dbe80985"},"source":["A[3:] # elements from index 3"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([ 3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19])"]},"metadata":{},"execution_count":39}]},{"cell_type":"markdown","metadata":{"id":"-A_gdzOxKEPX"},"source":["Negative indices counts from the end of the array (positive index from the begining):"]},{"cell_type":"code","metadata":{"collapsed":true,"id":"Vu0xK0ncKEPX"},"source":["A = np.array([1,2,3,4,5])"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"NCvpI00SKEPX","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239211634,"user_tz":-120,"elapsed":5,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"20e46b31-0248-4794-d98e-ddbdfb811bd5"},"source":["A[-1] # the last element in the array"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["5"]},"metadata":{},"execution_count":41}]},{"cell_type":"code","metadata":{"id":"jxcHW8psKEPX","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239212509,"user_tz":-120,"elapsed":6,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"ef1712c2-a11d-4218-bc53-5a1b6dc8ef8e"},"source":["A[-3:] # the last three elements"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([3, 4, 5])"]},"metadata":{},"execution_count":42}]},{"cell_type":"markdown","metadata":{"id":"0UAZSg3qKEPX"},"source":["Index slicing works exactly the same way for multidimensional arrays:"]},{"cell_type":"code","metadata":{"id":"Cd_UjLJqKEPX","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239214477,"user_tz":-120,"elapsed":324,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"0c86cff0-4d8f-4f30-e3dd-9397e4c66009"},"source":["A = np.array([[n+m*10 for n in range(5)] for m in range(5)])\n","\n","A"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[ 0,  1,  2,  3,  4],\n","       [10, 11, 12, 13, 14],\n","       [20, 21, 22, 23, 24],\n","       [30, 31, 32, 33, 34],\n","       [40, 41, 42, 43, 44]])"]},"metadata":{},"execution_count":43}]},{"cell_type":"code","metadata":{"id":"V7oXzr0kKEPY","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239215323,"user_tz":-120,"elapsed":6,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"47c008c0-f1de-4eba-a50c-e777f5c576cf"},"source":["# a block from the original array\n","A[1:4, 1:4]"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[11, 12, 13],\n","       [21, 22, 23],\n","       [31, 32, 33]])"]},"metadata":{},"execution_count":44}]},{"cell_type":"code","metadata":{"id":"n3CsVGFFKEPY","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239216529,"user_tz":-120,"elapsed":334,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"56b6fdf9-7875-445e-f6e2-e9db533654b1"},"source":["# strides\n","A[::2, ::2]"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[ 0,  2,  4],\n","       [20, 22, 24],\n","       [40, 42, 44]])"]},"metadata":{},"execution_count":45}]},{"cell_type":"markdown","metadata":{"id":"0wGPNRWxKEPY"},"source":["### Fancy indexing"]},{"cell_type":"markdown","metadata":{"id":"hjaN4K1vKEPY"},"source":["Fancy indexing is the name for when an array or list is used in-place of an index: "]},{"cell_type":"code","metadata":{"id":"M7RGYP4gKEPY","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239219167,"user_tz":-120,"elapsed":204,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"81ff7ac7-2dab-4c54-c937-f4073d7ac6a2"},"source":["row_indices = [1, 2, 3]\n","A[row_indices]"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[10, 11, 12, 13, 14],\n","       [20, 21, 22, 23, 24],\n","       [30, 31, 32, 33, 34]])"]},"metadata":{},"execution_count":46}]},{"cell_type":"code","metadata":{"id":"_DRfs_PsKEPY","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239220116,"user_tz":-120,"elapsed":6,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"052ec228-2452-4240-ab16-13a6083c3bd0"},"source":["col_indices = [1, 2, -1] # remember, index -1 means the last element\n","A[row_indices, col_indices]"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([11, 22, 34])"]},"metadata":{},"execution_count":47}]},{"cell_type":"markdown","metadata":{"id":"KDu56uT7KEPY"},"source":["We can also use index masks: If the index mask is an Numpy array of data type `bool`, then an element is selected (True) or not (False) depending on the value of the index mask at the position of each element: "]},{"cell_type":"code","metadata":{"id":"26LUtieeKEPZ","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239221900,"user_tz":-120,"elapsed":262,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"de53fd97-bc6b-43db-b4f2-299c7bca585a"},"source":["B = np.array([n for n in range(5)])\n","B"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([0, 1, 2, 3, 4])"]},"metadata":{},"execution_count":48}]},{"cell_type":"code","metadata":{"id":"3FjiDr2GKEPZ","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239222763,"user_tz":-120,"elapsed":6,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"ac07f02b-4ea0-4eb7-c8b2-c6233a17c8d2"},"source":["row_mask = np.array([True, False, True, False, False]) #selects elements where the mask is True\n","B[row_mask]"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([0, 2])"]},"metadata":{},"execution_count":49}]},{"cell_type":"code","metadata":{"id":"otFanB-RKEPZ","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239223672,"user_tz":-120,"elapsed":5,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"9c4a76d5-a0a6-4aed-b0e3-fcf4e27b0984"},"source":["# same thing\n","row_mask = np.array([1,0,1,0,0], dtype=bool)\n","B[row_mask]"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([0, 2])"]},"metadata":{},"execution_count":50}]},{"cell_type":"markdown","metadata":{"id":"egZZbcM6KEPZ"},"source":["This feature is very useful to conditionally select elements from an array, using for example comparison operators:"]},{"cell_type":"code","metadata":{"id":"3cIUXWJbKEPZ","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239231900,"user_tz":-120,"elapsed":241,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"7016d98e-81cc-4ec7-dd8e-73a535687b86"},"source":["x = np.arange(0, 10, 0.5)#array I want to select elements from\n","x"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([0. , 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5, 5. , 5.5, 6. ,\n","       6.5, 7. , 7.5, 8. , 8.5, 9. , 9.5])"]},"metadata":{},"execution_count":53}]},{"cell_type":"code","metadata":{"id":"9FuHi0OjKEPZ","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239233002,"user_tz":-120,"elapsed":229,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"b53d7334-a042-48f3-aac6-e9292402eb8d"},"source":["mask = (5 < x) * (x < 7.5) #build a mask using comparison conditions\n","\n","mask"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([False, False, False, False, False, False, False, False, False,\n","       False, False,  True,  True,  True,  True, False, False, False,\n","       False, False])"]},"metadata":{},"execution_count":54}]},{"cell_type":"code","metadata":{"id":"1hVPMSWtKEPa","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239234101,"user_tz":-120,"elapsed":247,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"14ec0baf-7765-43e9-b290-98c1259e4d4a"},"source":["x[mask]#apply mask to obtain reduced array"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([5.5, 6. , 6.5, 7. ])"]},"metadata":{},"execution_count":55}]},{"cell_type":"code","metadata":{"id":"Th5A9KUMKEPa","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239241148,"user_tz":-120,"elapsed":206,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"917324eb-9d0e-4fee-88ce-e42abcb6e9d6"},"source":["indices = np.where(mask) #get indices where the mask is True (converting index mask to position indices)\n","\n","indices"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["(array([11, 12, 13, 14]),)"]},"metadata":{},"execution_count":57}]},{"cell_type":"markdown","metadata":{"id":"9992mgcVKEPb"},"source":["#### take\n"]},{"cell_type":"markdown","metadata":{"id":"vSKIkvpDKEPb"},"source":["The `take` function is similar to fancy indexing described above:"]},{"cell_type":"code","metadata":{"id":"ZE8D6Qu5KEPb","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239249394,"user_tz":-120,"elapsed":319,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"df699de8-8b75-4b74-e187-5fc702441f3a"},"source":["v2 = np.arange(-3,3)\n","v2"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([-3, -2, -1,  0,  1,  2])"]},"metadata":{},"execution_count":58}]},{"cell_type":"code","metadata":{"id":"K3bEJ8dCKEPb","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239252475,"user_tz":-120,"elapsed":207,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"044e2c48-5b35-48d2-87b8-3369be4c195e"},"source":["row_indices = [1, 3, 5]\n","v2[row_indices] # fancy indexing"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([-2,  0,  2])"]},"metadata":{},"execution_count":59}]},{"cell_type":"code","metadata":{"id":"6kIOwObNKEPb","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239254290,"user_tz":-120,"elapsed":220,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"9a424d2a-eca3-4ae7-c6e4-386d5ac3903b"},"source":["v2.take(row_indices)"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([-2,  0,  2])"]},"metadata":{},"execution_count":60}]},{"cell_type":"markdown","metadata":{"id":"f0DieZO7KEPb"},"source":["But `take` also works on lists and other objects:"]},{"cell_type":"code","metadata":{"id":"vj1ZaefsKEPc","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239259199,"user_tz":-120,"elapsed":208,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"087d15a7-a165-4127-c7fd-19257891f889"},"source":["np.take([-3, -2, -1,  0,  1,  2], row_indices)"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([-2,  0,  2])"]},"metadata":{},"execution_count":61}]},{"cell_type":"markdown","metadata":{"id":"iTQq-4U48O5s"},"source":["## Iterating over arrays"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"lXAq5sCg8WdM","executionInfo":{"status":"ok","timestamp":1632239261529,"user_tz":-120,"elapsed":202,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"154ec15f-12d1-4cab-a93e-6d0cd25f6c34"},"source":["v=np.array([1,2,3,4])\n","\n","for elem in v:\n","    print(elem)\n","\n","for index, elem in enumerate(v):\n","    print(index,elem)\n"],"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["1\n","2\n","3\n","4\n","0 1\n","1 2\n","2 3\n","3 4\n"]}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"I-rTR4k2APsr","executionInfo":{"status":"ok","timestamp":1632239262715,"user_tz":-120,"elapsed":319,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"eedc7d60-133f-4e61-f648-0067120983a2"},"source":["M = np.array([[1,2], [3,4]])\n","\n","for row in M: #the for cycles always loop on the first index of a numpy array\n","    print(\"row\", row)\n","    \n","    for element in row:\n","        print(element)"],"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["row [1 2]\n","1\n","2\n","row [3 4]\n","3\n","4\n"]}]},{"cell_type":"markdown","metadata":{"id":"TW8Hqz1wKEPc"},"source":["## Linear algebra"]},{"cell_type":"markdown","metadata":{"id":"xDZ_fZ7-KEPc"},"source":["Vectorizing code is the key to writing efficient numerical calculation with Python/Numpy. That means that as much as possible of a program should be formulated in terms of matrix and vector operations, like matrix-matrix multiplication."]},{"cell_type":"markdown","metadata":{"id":"AtTAQE3RKEPc"},"source":["### Scalar-array operations"]},{"cell_type":"markdown","metadata":{"id":"nmiZ8kekKEPc"},"source":["We can use the usual arithmetic operators to multiply, add, subtract, and divide arrays with scalar numbers."]},{"cell_type":"code","metadata":{"collapsed":true,"id":"0jITINiUKEPc"},"source":["v1 = np.arange(0, 5)"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"TUOcsiMUKEPc","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239267928,"user_tz":-120,"elapsed":5,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"635b1bc2-bc06-41ed-9f89-7cd0e1b456b2"},"source":["v1 * 2"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([0, 2, 4, 6, 8])"]},"metadata":{},"execution_count":65}]},{"cell_type":"code","metadata":{"id":"xz3X8rvXKEPd","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239268741,"user_tz":-120,"elapsed":6,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"21764413-9d23-49cf-849d-86b6230b62c6"},"source":["v1 + 2"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([2, 3, 4, 5, 6])"]},"metadata":{},"execution_count":66}]},{"cell_type":"code","metadata":{"id":"2KGfWw7bKEPd","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239269081,"user_tz":-120,"elapsed":5,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"1abaa6a0-5865-4852-fe88-17e2a6978a1d"},"source":["A = np.array([[n+m*10 for n in range(5)] for m in range(5)])\n","A * 2, A + 2"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["(array([[ 0,  2,  4,  6,  8],\n","        [20, 22, 24, 26, 28],\n","        [40, 42, 44, 46, 48],\n","        [60, 62, 64, 66, 68],\n","        [80, 82, 84, 86, 88]]), array([[ 2,  3,  4,  5,  6],\n","        [12, 13, 14, 15, 16],\n","        [22, 23, 24, 25, 26],\n","        [32, 33, 34, 35, 36],\n","        [42, 43, 44, 45, 46]]))"]},"metadata":{},"execution_count":67}]},{"cell_type":"markdown","metadata":{"id":"VkOCMtf8KEPd"},"source":["### Element-wise array-array operations"]},{"cell_type":"markdown","metadata":{"id":"TfJkq1khKEPd"},"source":["When we add, subtract, multiply and divide arrays with each other, the default behaviour is **element-wise** operations:"]},{"cell_type":"code","metadata":{"id":"XrmR0IkoKEPd","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239271441,"user_tz":-120,"elapsed":221,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"1a1bc48d-2365-4521-a3ca-f1e8a9faeeb1"},"source":["A * A # element-wise multiplication"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[   0,    1,    4,    9,   16],\n","       [ 100,  121,  144,  169,  196],\n","       [ 400,  441,  484,  529,  576],\n","       [ 900,  961, 1024, 1089, 1156],\n","       [1600, 1681, 1764, 1849, 1936]])"]},"metadata":{},"execution_count":68}]},{"cell_type":"code","metadata":{"id":"S3uDn_thKEPd","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239272360,"user_tz":-120,"elapsed":7,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"33a993e8-68ad-44fc-b8ee-0fd1bbf73107"},"source":["v1 * v1"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([ 0,  1,  4,  9, 16])"]},"metadata":{},"execution_count":69}]},{"cell_type":"markdown","metadata":{"id":"oaiAdgabKEPd"},"source":["If we multiply arrays with compatible shapes, we get an element-wise multiplication of each row:"]},{"cell_type":"code","metadata":{"id":"maC0G27lKEPd","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239273942,"user_tz":-120,"elapsed":212,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"d8255c8d-38da-40a3-80c7-f37fb0b4b9b4"},"source":["A.shape, v1.shape"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["((5, 5), (5,))"]},"metadata":{},"execution_count":70}]},{"cell_type":"code","metadata":{"id":"obiMpMYSKEPe","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239274602,"user_tz":-120,"elapsed":6,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"dd93df79-c85e-436e-ef94-771d8b252ead"},"source":["A * v1"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[  0,   1,   4,   9,  16],\n","       [  0,  11,  24,  39,  56],\n","       [  0,  21,  44,  69,  96],\n","       [  0,  31,  64,  99, 136],\n","       [  0,  41,  84, 129, 176]])"]},"metadata":{},"execution_count":71}]},{"cell_type":"markdown","metadata":{"id":"tRPyxW1dKEPf"},"source":["### Matrix algebra"]},{"cell_type":"markdown","metadata":{"id":"CpBQkYpQKEPf"},"source":["What about matrix mutiplication? There are two ways. We can either use the `dot` function,matrix vectorwhich applies a matrix-matrix, matrix-vector, or inner vector multiplication to its two arguments: "]},{"cell_type":"code","metadata":{"id":"BvePdOL0KEPf","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239276944,"user_tz":-120,"elapsed":232,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"30c0e0ac-59ae-4859-8d80-f5c0013ba518"},"source":["np.matmul(A, A) #matrix multiplication"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[ 300,  310,  320,  330,  340],\n","       [1300, 1360, 1420, 1480, 1540],\n","       [2300, 2410, 2520, 2630, 2740],\n","       [3300, 3460, 3620, 3780, 3940],\n","       [4300, 4510, 4720, 4930, 5140]])"]},"metadata":{},"execution_count":72}]},{"cell_type":"code","metadata":{"id":"WXXZQpGyKEPf","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239277670,"user_tz":-120,"elapsed":6,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"437f88d6-5286-4984-fc11-d684263a0ce6"},"source":["np.matmul(A, v1)"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([ 30, 130, 230, 330, 430])"]},"metadata":{},"execution_count":73}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"NjDuo_zAhUY5","executionInfo":{"status":"ok","timestamp":1632239278919,"user_tz":-120,"elapsed":297,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"2e301852-ff33-40ab-f38a-c223a926d3be"},"source":["np.dot(A,v1)"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([ 30, 130, 230, 330, 430])"]},"metadata":{},"execution_count":74}]},{"cell_type":"code","metadata":{"id":"dRN5ND86KEPf","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239279240,"user_tz":-120,"elapsed":6,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"131e6ecc-87c7-4661-af03-05966c063729"},"source":["np.dot(v1, v1)"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["30"]},"metadata":{},"execution_count":75}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"XXd2OpMOhnwY","executionInfo":{"status":"ok","timestamp":1632239280135,"user_tz":-120,"elapsed":6,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"76a3547c-e166-425a-a1cc-ea1b5d0a8229"},"source":["#trasposing matrices\n","print(A)\n","print(A.T)"],"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["[[ 0  1  2  3  4]\n"," [10 11 12 13 14]\n"," [20 21 22 23 24]\n"," [30 31 32 33 34]\n"," [40 41 42 43 44]]\n","[[ 0 10 20 30 40]\n"," [ 1 11 21 31 41]\n"," [ 2 12 22 32 42]\n"," [ 3 13 23 33 43]\n"," [ 4 14 24 34 44]]\n"]}]},{"cell_type":"markdown","metadata":{"id":"Cm25XNWrKEPh"},"source":["See also the related functions: `inner`, `outer`, `cross`, `kron`, `tensordot`."]},{"cell_type":"markdown","metadata":{"id":"7VhCJea6KEPi"},"source":["### Matrix computations"]},{"cell_type":"markdown","metadata":{"id":"342pB_RrKEPj"},"source":["#### Eigenvalues"]},{"cell_type":"code","metadata":{"id":"y3q67dKHiJOh"},"source":["size=10\n","\n","rand_mat=np.random.normal(size=[size,size])\n","rand_mat=0.5*(rand_mat+rand_mat.T)"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":271},"id":"7qsgAB3AiMKA","executionInfo":{"status":"ok","timestamp":1632239285063,"user_tz":-120,"elapsed":233,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"4dfe5cdb-6d5f-4e3e-9207-bd45a0693701"},"source":["plt.matshow(rand_mat)\n","plt.colorbar()"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["<matplotlib.colorbar.Colorbar at 0x7facb9b8a350>"]},"metadata":{},"execution_count":78},{"output_type":"display_data","data":{"image/png":"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\n","text/plain":["<Figure size 288x288 with 2 Axes>"]},"metadata":{"needs_background":"light"}}]},{"cell_type":"code","metadata":{"id":"l8AwMPJbibdw"},"source":["eigenvals,eigenvects=np.linalg.eig(rand_mat)"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":350},"id":"vpL0y-ZbkHzp","executionInfo":{"status":"ok","timestamp":1632239287085,"user_tz":-120,"elapsed":8,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"d309b38a-ee38-4c54-9812-57523c512fa3"},"source":["plt.hist(eigenvals)"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["(array([1., 2., 1., 0., 1., 2., 0., 1., 1., 1.]),\n"," array([-3.26697031, -2.56402291, -1.8610755 , -1.15812809, -0.45518068,\n","         0.24776673,  0.95071414,  1.65366155,  2.35660896,  3.05955637,\n","         3.76250377]),\n"," <a list of 10 Patch objects>)"]},"metadata":{},"execution_count":80},{"output_type":"display_data","data":{"image/png":"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\n","text/plain":["<Figure size 432x288 with 1 Axes>"]},"metadata":{"needs_background":"light"}}]},{"cell_type":"code","metadata":{"id":"Z06JDQV0KEPj"},"source":["rand_mat_inverse=np.linalg.inv(rand_mat) "],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"kApUzmZXKEPj","colab":{"base_uri":"https://localhost:8080/","height":292},"executionInfo":{"status":"ok","timestamp":1632239289108,"user_tz":-120,"elapsed":351,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"002391cb-9805-4aab-8865-84a6804f6612"},"source":["plt.matshow(np.matmul(rand_mat,rand_mat_inverse))"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["<matplotlib.image.AxesImage at 0x7facb11e1390>"]},"metadata":{},"execution_count":82},{"output_type":"display_data","data":{"image/png":"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\n","text/plain":["<Figure size 288x288 with 1 Axes>"]},"metadata":{"needs_background":"light"}}]},{"cell_type":"markdown","metadata":{"id":"rUv76YRBKEPk"},"source":["#### Determinant\n","<img width=40px src='images/help.png' style=\"display:inline-block;\"/> <b>numpy-ref-1.15.1.pdf</b> pag. 682<br>"]},{"cell_type":"code","metadata":{"id":"EcAMN4A_KEPk","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239290894,"user_tz":-120,"elapsed":300,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"8bdeeb02-c59b-43ae-8b54-267c4d4becc3"},"source":["np.linalg.det(rand_mat)"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["-28.572082562342338"]},"metadata":{},"execution_count":83}]},{"cell_type":"code","metadata":{"id":"UqY_2c5TKEPk","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239291669,"user_tz":-120,"elapsed":6,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"d721c40f-aca2-4a5c-e1cd-46af225943b7"},"source":["np.linalg.det(rand_mat_inverse)"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["-0.03499919887946806"]},"metadata":{},"execution_count":84}]},{"cell_type":"markdown","metadata":{"id":"DRqmwPwNKEPk"},"source":["### Data processing"]},{"cell_type":"code","metadata":{"id":"CErboX9NKEPo"},"source":["data=np.random.random([20,10])"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"i-DnvBY0KEPp","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239294002,"user_tz":-120,"elapsed":9,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"f7991f6f-9e14-41d2-cd54-5886bf122015"},"source":["#mean, standard deviation and variance of the third column\n","\n","min=np.min(data[:,3])\n","max=np.max(data[:,3])\n","mean=np.mean(data[:,3])\n","std=np.std(data[:,3])\n","sum=np.sum(data[:,3])\n","prod=np.prod(data[:,3])\n","print(\"min=%.3f\"%min)\n","print(\"max=%.3f\"%max)\n","print(\"mean=%.3f\"%mean)\n","print(\"std=%.3f\"%std)\n","print(\"sum=%.3f\"%sum)\n","print(\"prod=%.3f\"%prod)"],"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["min=0.016\n","max=0.986\n","mean=0.546\n","std=0.290\n","sum=10.927\n","prod=0.000\n"]}]},{"cell_type":"markdown","metadata":{"id":"rB1QQFcQKEPs"},"source":["### Calculations with higher-dimensional data"]},{"cell_type":"markdown","metadata":{"id":"iOZGSSNNKEPs"},"source":["When functions such as `min`, `max`, etc. are applied to a multidimensional arrays, it is sometimes useful to apply the calculation to the entire array, and sometimes only on a row or column basis. Using the `axis` argument we can specify how these functions should behave: "]},{"cell_type":"code","metadata":{"id":"hLS9UAdvKEPs","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239296720,"user_tz":-120,"elapsed":217,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"b78e70de-0414-424e-9bf8-be442412e2d8"},"source":["m = random.rand(3,3)\n","m"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[0.43964088, 0.15082011, 0.35473688],\n","       [0.18907701, 0.24573069, 0.6005465 ],\n","       [0.09364923, 0.93409809, 0.07055577]])"]},"metadata":{},"execution_count":87}]},{"cell_type":"code","metadata":{"id":"JvTT76cFKEPs","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239297612,"user_tz":-120,"elapsed":6,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"caa69a57-8ee8-4289-b0a5-89c33ca175da"},"source":["# global max\n","m.max()"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["0.934098086914323"]},"metadata":{},"execution_count":88}]},{"cell_type":"code","metadata":{"id":"9gVWwonKKEPs","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239297970,"user_tz":-120,"elapsed":5,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"6aba2a09-9034-4d02-de13-e6c89eb136e7"},"source":["# max in each column\n","m.max(axis=0)"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([0.43964088, 0.93409809, 0.6005465 ])"]},"metadata":{},"execution_count":89}]},{"cell_type":"code","metadata":{"id":"_Cj7RD21KEPt","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239298690,"user_tz":-120,"elapsed":7,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"b3084f49-1a1d-4885-bb10-81a6dddeceb6"},"source":["# max in each row\n","m.max(axis=1)"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([0.43964088, 0.6005465 , 0.93409809])"]},"metadata":{},"execution_count":90}]},{"cell_type":"markdown","metadata":{"id":"gydymI4BKEPt"},"source":["## Reshaping, resizing and stacking arrays"]},{"cell_type":"markdown","metadata":{"id":"ks7tC_hpKEPt"},"source":["The shape of an Numpy array can be modified without copying the underlaying data, which makes it a fast operation even for large arrays."]},{"cell_type":"code","metadata":{"id":"h-N-ClzNKEPt","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239305948,"user_tz":-120,"elapsed":209,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"eef50b07-9307-4234-bf27-d2fda17af63d"},"source":["A"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[ 0,  1,  2,  3,  4],\n","       [10, 11, 12, 13, 14],\n","       [20, 21, 22, 23, 24],\n","       [30, 31, 32, 33, 34],\n","       [40, 41, 42, 43, 44]])"]},"metadata":{},"execution_count":91}]},{"cell_type":"code","metadata":{"collapsed":true,"id":"IC31y5T-KEPt"},"source":["n, m = A.shape"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"2xbergXiKEPt","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239307613,"user_tz":-120,"elapsed":6,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"61c63fe4-16bf-47f2-aaa0-8f92177bdac0"},"source":["B = A.reshape((1,n*m))\n","B"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[ 0,  1,  2,  3,  4, 10, 11, 12, 13, 14, 20, 21, 22, 23, 24, 30,\n","        31, 32, 33, 34, 40, 41, 42, 43, 44]])"]},"metadata":{},"execution_count":93}]},{"cell_type":"code","metadata":{"id":"9do2SkcVKEPt","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239308379,"user_tz":-120,"elapsed":6,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"23636887-ef25-46a1-b97f-ea376119bcb2"},"source":["B[0,0:5] = 5 # modify the array\n","\n","B"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[ 5,  5,  5,  5,  5, 10, 11, 12, 13, 14, 20, 21, 22, 23, 24, 30,\n","        31, 32, 33, 34, 40, 41, 42, 43, 44]])"]},"metadata":{},"execution_count":94}]},{"cell_type":"code","metadata":{"id":"4ECFBVunKEPt","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239309317,"user_tz":-120,"elapsed":6,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"1a653057-486a-4ab6-ca0c-fc3d882b8997"},"source":["A # and the original variable is also changed. B is only a different view of the same data"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[ 5,  5,  5,  5,  5],\n","       [10, 11, 12, 13, 14],\n","       [20, 21, 22, 23, 24],\n","       [30, 31, 32, 33, 34],\n","       [40, 41, 42, 43, 44]])"]},"metadata":{},"execution_count":95}]},{"cell_type":"markdown","metadata":{"id":"AdQVIodnKEPt"},"source":["We can also use the function `flatten` to make a higher-dimensional array into a vector. But this function create a copy of the data."]},{"cell_type":"code","metadata":{"id":"h-H9AKLLKEPu","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239311113,"user_tz":-120,"elapsed":210,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"5f5be8fb-e99e-45b4-a5ba-2ff6ee92b809"},"source":["B = A.flatten()\n","\n","B"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([ 5,  5,  5,  5,  5, 10, 11, 12, 13, 14, 20, 21, 22, 23, 24, 30, 31,\n","       32, 33, 34, 40, 41, 42, 43, 44])"]},"metadata":{},"execution_count":96}]},{"cell_type":"code","metadata":{"id":"ouGYtcejKEPu","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239311819,"user_tz":-120,"elapsed":7,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"a1973d02-a95b-4fc5-b05f-e6a268b4dfa9"},"source":["B[0:5] = 10\n","\n","B"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([10, 10, 10, 10, 10, 10, 11, 12, 13, 14, 20, 21, 22, 23, 24, 30, 31,\n","       32, 33, 34, 40, 41, 42, 43, 44])"]},"metadata":{},"execution_count":97}]},{"cell_type":"code","metadata":{"id":"7RpNKy3AKEPu","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239312553,"user_tz":-120,"elapsed":6,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"a7f8e83c-d97d-4c8b-ed98-25e084730892"},"source":["A # now A has not changed, because B's data is a copy of A's, not refering to the same data"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[ 5,  5,  5,  5,  5],\n","       [10, 11, 12, 13, 14],\n","       [20, 21, 22, 23, 24],\n","       [30, 31, 32, 33, 34],\n","       [40, 41, 42, 43, 44]])"]},"metadata":{},"execution_count":98}]},{"cell_type":"markdown","metadata":{"id":"3P3wW77VKEPv"},"source":["## Stacking and repeating arrays"]},{"cell_type":"markdown","metadata":{"id":"2OZAZz6pKEPv"},"source":["### concatenate"]},{"cell_type":"code","metadata":{"collapsed":true,"id":"YPFqpCckKEPv"},"source":["a=np.array([[1,2],[3,4]])\n","b = np.array([[5, 6]])"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"BaAsN1aRKEPv","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239386108,"user_tz":-120,"elapsed":710,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"3e5d1491-6eab-4719-d26d-c47ac2a5bd8d"},"source":["np.concatenate((a, b), axis=0) # join along rows (add b as new row)"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[1, 2],\n","       [3, 4],\n","       [5, 6]])"]},"metadata":{},"execution_count":107}]},{"cell_type":"code","metadata":{"id":"A8Dn3eiLKEPv","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239394813,"user_tz":-120,"elapsed":203,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"914d6a4c-4b61-4133-d733-03ed51a72e04"},"source":["np.concatenate((a, b.T), axis=1) #add b as column (add b as new column)"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[1, 2, 5],\n","       [3, 4, 6]])"]},"metadata":{},"execution_count":109}]},{"cell_type":"markdown","metadata":{"id":"3_jp-F2OKEPw"},"source":["## Copy and \"deep copy\""]},{"cell_type":"markdown","metadata":{"id":"AoxdTK6TKEPw"},"source":["To achieve high performance, assignments in Python usually do not copy the underlaying objects. This is important for example when objects are passed between functions, to avoid an excessive amount of memory copying when it is not necessary (technical term: pass by reference). "]},{"cell_type":"code","metadata":{"id":"USPaTNLsKEPw","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239406475,"user_tz":-120,"elapsed":246,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"17f3d5b7-9f44-4767-ac19-09ce80c98d45"},"source":["A = np.array([[1, 2], [3, 4]])\n","\n","A"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[1, 2],\n","       [3, 4]])"]},"metadata":{},"execution_count":111}]},{"cell_type":"code","metadata":{"collapsed":true,"id":"lN5vXTNnKEPw"},"source":["# now B is referring to the same array data as A \n","B = A "],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"Fy0R4E0rKEPw","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239408616,"user_tz":-120,"elapsed":6,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"a725280f-fbc4-41d4-b7ff-1d27cb20c4c9"},"source":["# changing B affects A\n","B[0,0] = 10\n","\n","B"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[10,  2],\n","       [ 3,  4]])"]},"metadata":{},"execution_count":113}]},{"cell_type":"code","metadata":{"id":"ieubErDsKEPw","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239409691,"user_tz":-120,"elapsed":213,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"83554749-df38-4269-ecab-6af0da5065c4"},"source":["A"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[10,  2],\n","       [ 3,  4]])"]},"metadata":{},"execution_count":114}]},{"cell_type":"markdown","metadata":{"id":"bzybJ9NyKEPw"},"source":["If we want to avoid this behavior, so that when we get a new completely independent object `B` copied from `A`, then we need to do a so-called \"deep copy\" using the function `copy`:"]},{"cell_type":"code","metadata":{"collapsed":true,"id":"IT94MY_TKEPx"},"source":["B = np.copy(A)"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"n4l-l27jKEPx","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239418192,"user_tz":-120,"elapsed":222,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"d0b3ec79-28d9-4794-b17b-45ba39a2c1a1"},"source":["# now, if we modify B, A is not affected\n","B[0,0] = -5\n","\n","B"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[-5,  2],\n","       [ 3,  4]])"]},"metadata":{},"execution_count":118}]},{"cell_type":"code","metadata":{"id":"siZB2nEeKEPx","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239419050,"user_tz":-120,"elapsed":6,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"a869f130-3eab-45d7-c368-6a80048ee664"},"source":["A"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[-5,  2],\n","       [ 3,  4]])"]},"metadata":{},"execution_count":119}]},{"cell_type":"markdown","metadata":{"id":"el35CpYbKEPy"},"source":["## Vectorizing functions"]},{"cell_type":"markdown","metadata":{"id":"SjClbkngKEPy"},"source":["As mentioned several times by now, to get good performance we should try to avoid looping over elements in our vectors and matrices, and instead use vectorized algorithms. The first step in converting a scalar algorithm to a vectorized algorithm is to make sure that the functions we write work with vector inputs."]},{"cell_type":"code","metadata":{"collapsed":true,"id":"-mME3GTmKEPy"},"source":["def Theta(x):\n","    \"\"\"\n","    Scalar implemenation of the Heaviside step function.\n","    \"\"\"\n","    if x >= 0:\n","        return 1\n","    else:\n","        return 0"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"TSZ0XgYsKEPy","colab":{"base_uri":"https://localhost:8080/","height":283},"executionInfo":{"status":"error","timestamp":1632239422768,"user_tz":-120,"elapsed":5,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"c9dcd129-d6b1-45ef-91a5-561f2cd4bc7b"},"source":["Theta(np.array([-3,-2,-1,0,1,2,3]))"],"execution_count":null,"outputs":[{"output_type":"error","ename":"ValueError","evalue":"ignored","traceback":["\u001b[0;31m---------------------------------------------------------------------------\u001b[0m","\u001b[0;31mValueError\u001b[0m                                Traceback (most recent call last)","\u001b[0;32m<ipython-input-121-b49266106206>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mTheta\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\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[0m","\u001b[0;32m<ipython-input-120-f72d7f42be84>\u001b[0m in \u001b[0;36mTheta\u001b[0;34m(x)\u001b[0m\n\u001b[1;32m      3\u001b[0m     \u001b[0mScalar\u001b[0m \u001b[0mimplemenation\u001b[0m \u001b[0mof\u001b[0m \u001b[0mthe\u001b[0m \u001b[0mHeaviside\u001b[0m \u001b[0mstep\u001b[0m \u001b[0mfunction\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     \"\"\"\n\u001b[0;32m----> 5\u001b[0;31m     \u001b[0;32mif\u001b[0m \u001b[0mx\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[0m\u001b[1;32m      6\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      7\u001b[0m     \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;31mValueError\u001b[0m: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()"]}]},{"cell_type":"markdown","metadata":{"id":"9potSIHgKEPy"},"source":["OK, that didn't work because we didn't write the `Theta` function so that it can handle a vector input... \n","\n","To get a vectorized version of Theta we can use the Numpy function `vectorize`. In many cases it can automatically vectorize a function:"]},{"cell_type":"code","metadata":{"collapsed":true,"id":"Xlm3gYd2KEPy"},"source":["Theta_vec = np.vectorize(Theta)"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"d6owTS6GKEPy","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239426301,"user_tz":-120,"elapsed":6,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"04ffae0f-2098-4a2d-8904-b2528a255117"},"source":["Theta_vec(np.array([-3,-2,-1,0,1,2,3]))"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([0, 0, 0, 1, 1, 1, 1])"]},"metadata":{},"execution_count":123}]},{"cell_type":"markdown","metadata":{"id":"Kl8Ev4emKEPy"},"source":["We can also implement the function to accept a vector input from the beginning (requires more effort but might give better performance):"]},{"cell_type":"code","metadata":{"collapsed":true,"id":"6g6CPbi5KEPy"},"source":["def Theta(x):\n","    \"\"\"\n","    Vector-aware implemenation of the Heaviside step function.\n","    \"\"\"\n","    return 1 * (x >= 0)"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"Pgg39CaZKEPy","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239429314,"user_tz":-120,"elapsed":6,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"1a0d4ae5-a368-40d7-c16a-d6591ef240ad"},"source":["Theta(np.array([-3,-2,-1,0,1,2,3]))"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([0, 0, 0, 1, 1, 1, 1])"]},"metadata":{},"execution_count":125}]},{"cell_type":"code","metadata":{"id":"K-QxHEvTKEPz","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239430404,"user_tz":-120,"elapsed":269,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"4eeff672-b346-4eae-a892-589a9ec96e71"},"source":["# still works for scalars as well\n","Theta(-1.2), Theta(2.6)"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["(0, 1)"]},"metadata":{},"execution_count":126}]},{"cell_type":"markdown","metadata":{"id":"8dMMAVvIKEPz"},"source":["## Using arrays in conditions"]},{"cell_type":"markdown","metadata":{"id":"zzwm5j6iKEPz"},"source":["When using arrays in conditions,for example `if` statements and other boolean expressions, one needs to use `any` or `all`, which requires that any or all elements in the array evalutes to `True`:"]},{"cell_type":"code","metadata":{"id":"HSQ5jrvZKEPz"},"source":["M=np.array([1,4,9,16])"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"VElVVCw6KEPz","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239434191,"user_tz":-120,"elapsed":205,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"8bf42cc9-0968-443a-8ddb-fdacdedd391b"},"source":["if (M > 5).any():\n","    print(\"at least one element in M is larger than 5\")\n","else:\n","    print(\"no element in M is larger than 5\")"],"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["at least one element in M is larger than 5\n"]}]},{"cell_type":"code","metadata":{"id":"_4eesuM3KEPz","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1632239435337,"user_tz":-120,"elapsed":210,"user":{"displayName":"Giovanni Piccioli","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiLaoLHa3s8BcYjznpYm1zg84NVjG47wGraGpbgILw=s64","userId":"06977241866726205603"}},"outputId":"08b63cf1-507a-478f-9de6-049b85069433"},"source":["if (M > 5).all():\n","    print(\"all elements in M are larger than 5\")\n","else:\n","    print(\"all elements in M are not larger than 5\")"],"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["all elements in M are not larger than 5\n"]}]},{"cell_type":"markdown","metadata":{"id":"9rlSB7J1KEPz"},"source":["Since Numpy arrays are *statically typed*, the type of an array does not change once created. But we can explicitly cast an array of some type to another using the `astype` functions (see also the similar `asarray` function). This always create a new array of new type:"]}]}