{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "*This notebook contains material for CBE 20258 Numerical and Statistical Analysis taught at the University of Notre Dame. (c) Professors Alexander Dowling, Ryan McClarren, and Yamil Colón. This collection of notebooks [cbe-xx258](https://ndcbe.github.io/cbe-xx258) is available [on Github](https://github.com/ndcbe/cbe-xx258).*\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "< [1.5 List, Dictionaries, and Enumeration](https://ndcbe.github.io/cbe-xx258/01.05-Lists-Dictionaries-Enumerate.html) | [Contents](toc.html) | [1.7 Visualization with matplotlib](https://ndcbe.github.io/cbe-xx258/01.07-Matplotlib.html) >

\"Open

\"Download\"" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "MElKNIbuqnWJ", "nbpages": { "level": 1, "link": "[1.6 Linear Algebra with Numpy and Scipy](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6-Linear-Algebra-with-Numpy-and-Scipy)", "section": "1.6 Linear Algebra with Numpy and Scipy" } }, "source": [ "# 1.6 Linear Algebra with Numpy and Scipy\n", "\n", "**Reference**: Chapter 1 of *Computational Nuclear Engineering and Radiological Science Using Python*, R. McClarren (2018)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "OS9TuD7EhSZQ", "nbpages": { "level": 2, "link": "[1.6.1 Learning Objectives](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.1-Learning-Objectives)", "section": "1.6.1 Learning Objectives" } }, "source": [ "## 1.6.1 Learning Objectives\n", "After studying this notebook, completing the activities, and asking questions in class, you should be able to:\n", "* Create, manipulate, and use NumPy arrays\n", " * Explain scoping rules for arrays in Python\n", " * Perform element-wise and matrix operations with arrays\n", " * Access elements of an array with indices and slices\n", " * Iterate over elements of an array with for loops" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "qUr_ziKTqnWL", "nbpages": { "level": 2, "link": "[1.6.2 NumPy Arrays](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2-NumPy-Arrays)", "section": "1.6.2 NumPy Arrays" } }, "source": [ "## 1.6.2 NumPy Arrays" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "U7VGvVepqnWM", "nbpages": { "level": 2, "link": "[1.6.2 NumPy Arrays](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2-NumPy-Arrays)", "section": "1.6.2 NumPy Arrays" } }, "source": [ "So far, we have discussed lists, which are containers that hold any type of Python object such as strings, floats, integers, other lists, etc.\n", "\n", "As engineers, we often want to store floating point numbers in vectors and matrices to perform linear algebra calculations. In this class, we will use **NumPy**. For a less engineering specific tutorial on NumPy, see https://docs.scipy.org/doc/numpy-1.15.0/user/quickstart.html\n", "\n", "The basic unit in numpy is a multi-dimensional array:\n", "* A one-dimensional (1-D) array is a **vector**\n", "* A 2-D array is a **matrix**\n", "* A 3-D array is a vector of matrices\n", "* etc" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 3, "link": "[1.6.2.1 Getting Started](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.1-Getting-Started)", "section": "1.6.2.1 Getting Started" } }, "source": [ "### 1.6.2.1 Getting Started" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 3, "link": "[1.6.2.1 Getting Started](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.1-Getting-Started)", "section": "1.6.2.1 Getting Started" } }, "source": [ "We'll start by loading the numpy module (a.k.a. library)." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true, "nbpages": { "level": 3, "link": "[1.6.2.1 Getting Started](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.1-Getting-Started)", "section": "1.6.2.1 Getting Started" } }, "outputs": [], "source": [ "# Import the numpy module (a.k.a library) and give it the \"nickname\" np\n", "# Warning: Do not modify this line. The autograde assumes numpy is loades as 'np'\n", "import numpy as np" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 3, "link": "[1.6.2.1 Getting Started](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.1-Getting-Started)", "section": "1.6.2.1 Getting Started" } }, "source": [ "We can now write `np.` to call functions in the numpy library (a.k.a. module). You'll see we place a few standard import statements at the top of most notebooks in this class." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 104 }, "colab_type": "code", "executionInfo": { "elapsed": 222, "status": "ok", "timestamp": 1548343368881, "user": { "displayName": "Alexander Dowling", "photoUrl": "https://lh3.googleusercontent.com/-LChdQ2m5OQE/AAAAAAAAAAI/AAAAAAAAAA0/JeXJe4vQJ7M/s64/photo.jpg", "userId": "00988067626794866502" }, "user_tz": 300 }, "id": "g9x9LjJ9qnWN", "nbpages": { "level": 3, "link": "[1.6.2.1 Getting Started](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.1-Getting-Started)", "section": "1.6.2.1 Getting Started" }, "outputId": "abef1bed-e788-44cf-c253-2e7c1dbd5be4" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The vector [1 2 3 4]\n", "The matrix\n", " [[1 2 3]\n", " [4 5 6]\n", " [7 8 9]]\n" ] } ], "source": [ "# Create a vector\n", "a_vector = np.array([1,2,3,4])\n", "\n", "# Create a matrix\n", "a_matrix = np.array([(1,2,3),(4,5,6),(7,8,9)])\n", "\n", "# Print to the screen\n", "print(\"The vector\",a_vector)\n", "print(\"The matrix\\n\",a_matrix)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "o0GjLpF5qnWR", "nbpages": { "level": 3, "link": "[1.6.2.1 Getting Started](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.1-Getting-Started)", "section": "1.6.2.1 Getting Started" } }, "source": [ "Arrays have several **attributes** that you can use to find out information regarding the array you're working with." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 52 }, "colab_type": "code", "executionInfo": { "elapsed": 349, "status": "ok", "timestamp": 1548343428032, "user": { "displayName": "Alexander Dowling", "photoUrl": "https://lh3.googleusercontent.com/-LChdQ2m5OQE/AAAAAAAAAAI/AAAAAAAAAA0/JeXJe4vQJ7M/s64/photo.jpg", "userId": "00988067626794866502" }, "user_tz": 300 }, "id": "qsg8MLrXqnWS", "nbpages": { "level": 3, "link": "[1.6.2.1 Getting Started](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.1-Getting-Started)", "section": "1.6.2.1 Getting Started" }, "outputId": "8f9f7c51-3907-4e7b-a0a7-7d34db98d936" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The shape of a_vector is (4,)\n", "The shape of a_matrix is (3, 3)\n" ] } ], "source": [ "#shape tells you the shape\n", "print(\"The shape of a_vector is \", a_vector.shape)\n", "print(\"The shape of a_matrix is \", a_matrix.shape)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 52 }, "colab_type": "code", "executionInfo": { "elapsed": 235, "status": "ok", "timestamp": 1548343447541, "user": { "displayName": "Alexander Dowling", "photoUrl": "https://lh3.googleusercontent.com/-LChdQ2m5OQE/AAAAAAAAAAI/AAAAAAAAAA0/JeXJe4vQJ7M/s64/photo.jpg", "userId": "00988067626794866502" }, "user_tz": 300 }, "id": "FJPmLTRgqnWU", "nbpages": { "level": 3, "link": "[1.6.2.1 Getting Started](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.1-Getting-Started)", "section": "1.6.2.1 Getting Started" }, "outputId": "c6e859e6-4fc4-4c9d-de50-ff83e97835b0" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The dimension of a_vector is 1\n", "The dimension of a_matrix is 2\n" ] } ], "source": [ "#ndim tells you the dimensionality of an array\n", "print(\"The dimension of a_vector is \", a_vector.ndim)\n", "print(\"The dimension of a_matrix is \", a_matrix.ndim)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 52 }, "colab_type": "code", "executionInfo": { "elapsed": 349, "status": "ok", "timestamp": 1548343461935, "user": { "displayName": "Alexander Dowling", "photoUrl": "https://lh3.googleusercontent.com/-LChdQ2m5OQE/AAAAAAAAAAI/AAAAAAAAAA0/JeXJe4vQJ7M/s64/photo.jpg", "userId": "00988067626794866502" }, "user_tz": 300 }, "id": "rOL818DSqnWX", "nbpages": { "level": 3, "link": "[1.6.2.1 Getting Started](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.1-Getting-Started)", "section": "1.6.2.1 Getting Started" }, "outputId": "5bec0c0d-e27a-4ba8-a20c-0ce9146bf8fc" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The size of a_vector is 4 = 4\n", "The size of a_matrix is 9 = 3 * 3\n" ] } ], "source": [ "#size is the total number of elements = \n", "#the product of the number of elements in each dimension\n", "print(\"The size of a_vector is \", a_vector.size,\"= \",\n", " a_vector.shape[0])\n", "print(\"The size of a_matrix is \", a_matrix.size,\"=\",\n", " a_matrix.shape[0],\"*\",a_matrix.shape[1])" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 3, "link": "[1.6.2.1 Getting Started](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.1-Getting-Started)", "section": "1.6.2.1 Getting Started" } }, "source": [ "Notice that `a_matrix.shape` is a list. We can access the number of rows with `a_matrix.shape[0]` and the number of columns with `a_matrix.shape[1]`." ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 3, "link": "[1.6.2.1 Getting Started](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.1-Getting-Started)", "section": "1.6.2.1 Getting Started" } }, "source": [ "

\n", "Home Activity: Create the array shown below and store it in the variable my_array.\n", "
" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 3, "link": "[1.6.2.1 Getting Started](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.1-Getting-Started)", "section": "1.6.2.1 Getting Started" } }, "source": [ "$$ A = \\begin{bmatrix} 1 & 2 \\\\ 3 & 1 \\\\ 9 & 2 \\end{bmatrix} $$" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "nbpages": { "level": 3, "link": "[1.6.2.1 Getting Started](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.1-Getting-Started)", "section": "1.6.2.1 Getting Started" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[1 2]\n", " [3 1]\n", " [9 2]]\n" ] } ], "source": [ "# YOUR SOLUTION HERE" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": true, "nbgrader": { "grade": true, "grade_id": "3a-i", "locked": true, "points": "0.1", "solution": false }, "nbpages": { "level": 3, "link": "[1.6.2.1 Getting Started](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.1-Getting-Started)", "section": "1.6.2.1 Getting Started" } }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 3, "link": "[1.6.2.1 Getting Started](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.1-Getting-Started)", "section": "1.6.2.1 Getting Started" } }, "source": [ "You can also re-size an array after you create it:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 121 }, "colab_type": "code", "executionInfo": { "elapsed": 340, "status": "ok", "timestamp": 1548343510838, "user": { "displayName": "Alexander Dowling", "photoUrl": "https://lh3.googleusercontent.com/-LChdQ2m5OQE/AAAAAAAAAAI/AAAAAAAAAA0/JeXJe4vQJ7M/s64/photo.jpg", "userId": "00988067626794866502" }, "user_tz": 300 }, "id": "KsU3Wdd3qnWZ", "nbpages": { "level": 3, "link": "[1.6.2.1 Getting Started](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.1-Getting-Started)", "section": "1.6.2.1 Getting Started" }, "outputId": "ebc21e24-ec8e-4b86-b04f-78a751df48ca" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "A is now a vector [2 4 6 8] \n", "\n", "A is now a matrix\n", " [[2 4]\n", " [6 8]]\n", "\n", "Now let's shape A back to a vector\n", "[2 4 6 8]\n" ] } ], "source": [ "A = np.array([2,4,6,8])\n", "print(\"A is now a vector\",A,\"\\n\")\n", "A = A.reshape(2,2)\n", "print(\"A is now a matrix\\n\",A)\n", "print(\"\\nNow let's shape A back to a vector\")\n", "print(A.reshape(4))" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 3, "link": "[1.6.2.1 Getting Started](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.1-Getting-Started)", "section": "1.6.2.1 Getting Started" } }, "source": [ "Notice how I needed to assign ``A`` with the reshaped array. We'll talk more about this later. \n", "\n", "We can resize `my_array` by stacking the 1st row followed by the 2nd row followed by the 3rd row:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "nbpages": { "level": 3, "link": "[1.6.2.1 Getting Started](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.1-Getting-Started)", "section": "1.6.2.1 Getting Started" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Before:\n", "[[1 2]\n", " [3 1]\n", " [9 2]]\n", "\n", "After stacking:\n", "[1 2 3 1 9 2]\n" ] } ], "source": [ "print(\"Before:\")\n", "print(my_array)\n", "\n", "print(\"\\nAfter stacking:\")\n", "print(my_array.reshape(6))" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 3, "link": "[1.6.2.1 Getting Started](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.1-Getting-Started)", "section": "1.6.2.1 Getting Started" } }, "source": [ "We can resize `my_array` by stacking the 2nd column under the first column." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "nbpages": { "level": 3, "link": "[1.6.2.1 Getting Started](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.1-Getting-Started)", "section": "1.6.2.1 Getting Started" } }, "outputs": [ { "data": { "text/plain": [ "array([1, 3, 9, 2, 1, 2])" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "my_array.reshape(6,order='F')" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 3, "link": "[1.6.2.1 Getting Started](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.1-Getting-Started)", "section": "1.6.2.1 Getting Started" } }, "source": [ "I want to highlight two things in the above example:\n", "1. NumPy does not distinguish between a row vector and a column vector.\n", "2. Specifying `order='F'` stacks by columns, which seems strange at first glance.\n", "\n", "Regarding 2., a quick check of the documentation, https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html, reveals that `order='C'` is the default. Moreover, `'C'` if shorthand for C-style stacking and `'F'` if short for Fortan-style stacking. C and Fortran are two mature (read \"old\") and popular programming languages for scientific computing. They use different conventions for storing arrays in memory, which means different stacking styles. The main take away is, *why in doubt, peek at the documentation*." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "BZUyHQ_ZqnWb", "nbpages": { "level": 3, "link": "[1.6.2.2 Creating Arrays in Neat Ways](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.2-Creating-Arrays-in-Neat-Ways)", "section": "1.6.2.2 Creating Arrays in Neat Ways" } }, "source": [ "### 1.6.2.2 Creating Arrays in Neat Ways" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "oLrSf-Q5qnWc", "nbpages": { "level": 3, "link": "[1.6.2.2 Creating Arrays in Neat Ways](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.2-Creating-Arrays-in-Neat-Ways)", "section": "1.6.2.2 Creating Arrays in Neat Ways" } }, "source": [ "The ``arange`` is a Numpy variant of the ``range`` we saw earlier. " ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 87 }, "colab_type": "code", "executionInfo": { "elapsed": 366, "status": "ok", "timestamp": 1548343545872, "user": { "displayName": "Alexander Dowling", "photoUrl": "https://lh3.googleusercontent.com/-LChdQ2m5OQE/AAAAAAAAAAI/AAAAAAAAAA0/JeXJe4vQJ7M/s64/photo.jpg", "userId": "00988067626794866502" }, "user_tz": 300 }, "id": "2mU81aSgqnWd", "nbpages": { "level": 3, "link": "[1.6.2.2 Creating Arrays in Neat Ways](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.2-Creating-Arrays-in-Neat-Ways)", "section": "1.6.2.2 Creating Arrays in Neat Ways" }, "outputId": "f4b57ea1-339e-4ac1-d1ff-4be2caecd595" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1. 1.1 1.2 1.3 1.4 1.5 1.6 1.7\n", " 1.8 1.9 2. 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3. 3.1 3.2 3.3 3.4 3.5\n", " 3.6 3.7 3.8 3.9 4. 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 5. 5.1 5.2 5.3\n", " 5.4 5.5 5.6 5.7 5.8 5.9 6. 6.1 6.2]\n" ] } ], "source": [ "#let's make a vector from 0 to 2*pi in intervals of 0.1\n", "dx = 0.1\n", "X = np.arange(0,2*np.pi,dx)\n", "print(X)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "xTOovzdzqnWh", "nbpages": { "level": 3, "link": "[1.6.2.2 Creating Arrays in Neat Ways](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.2-Creating-Arrays-in-Neat-Ways)", "section": "1.6.2.2 Creating Arrays in Neat Ways" } }, "source": [ "Typically, however, the ``linspace`` function is actually what you want." ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 208 }, "colab_type": "code", "executionInfo": { "elapsed": 348, "status": "ok", "timestamp": 1548343585263, "user": { "displayName": "Alexander Dowling", "photoUrl": "https://lh3.googleusercontent.com/-LChdQ2m5OQE/AAAAAAAAAAI/AAAAAAAAAA0/JeXJe4vQJ7M/s64/photo.jpg", "userId": "00988067626794866502" }, "user_tz": 300 }, "id": "NFgaVYPsqnWh", "nbpages": { "level": 3, "link": "[1.6.2.2 Creating Arrays in Neat Ways](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.2-Creating-Arrays-in-Neat-Ways)", "section": "1.6.2.2 Creating Arrays in Neat Ways" }, "outputId": "c6371ac5-9c83-4ebb-8743-f3154faa39df" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0. 0.10300304 0.20600608 0.30900911 0.41201215 0.51501519\n", " 0.61801823 0.72102126 0.8240243 0.92702734 1.03003038 1.13303342\n", " 1.23603645 1.33903949 1.44204253 1.54504557 1.64804861 1.75105164\n", " 1.85405468 1.95705772 2.06006076 2.16306379 2.26606683 2.36906987\n", " 2.47207291 2.57507595 2.67807898 2.78108202 2.88408506 2.9870881\n", " 3.09009113 3.19309417 3.29609721 3.39910025 3.50210329 3.60510632\n", " 3.70810936 3.8111124 3.91411544 4.01711848 4.12012151 4.22312455\n", " 4.32612759 4.42913063 4.53213366 4.6351367 4.73813974 4.84114278\n", " 4.94414582 5.04714885 5.15015189 5.25315493 5.35615797 5.459161\n", " 5.56216404 5.66516708 5.76817012 5.87117316 5.97417619 6.07717923\n", " 6.18018227 6.28318531]\n" ] } ], "source": [ "X = np.linspace(start = 0, stop = 2*np.pi, num = 62)\n", "print(X)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "T9njl1VSqnWk", "nbpages": { "level": 3, "link": "[1.6.2.2 Creating Arrays in Neat Ways](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.2-Creating-Arrays-in-Neat-Ways)", "section": "1.6.2.2 Creating Arrays in Neat Ways" } }, "source": [ "Notice how it starts and ends exactly where I told it to." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "KsEL6BgZqnWk", "nbpages": { "level": 3, "link": "[1.6.2.2 Creating Arrays in Neat Ways](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.2-Creating-Arrays-in-Neat-Ways)", "section": "1.6.2.2 Creating Arrays in Neat Ways" } }, "source": [ "If you want an array of zeros or ones, NumPy has a function for you." ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 121 }, "colab_type": "code", "executionInfo": { "elapsed": 262, "status": "ok", "timestamp": 1548343626286, "user": { "displayName": "Alexander Dowling", "photoUrl": "https://lh3.googleusercontent.com/-LChdQ2m5OQE/AAAAAAAAAAI/AAAAAAAAAA0/JeXJe4vQJ7M/s64/photo.jpg", "userId": "00988067626794866502" }, "user_tz": 300 }, "id": "V6wYkOtsqnWl", "nbpages": { "level": 3, "link": "[1.6.2.2 Creating Arrays in Neat Ways](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.2-Creating-Arrays-in-Neat-Ways)", "section": "1.6.2.2 Creating Arrays in Neat Ways" }, "outputId": "696adbbf-56da-4e62-d7c5-85aa1015978a" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The zero vector: [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n", "The zero matrix\n", " [[0. 0. 0. 0.]\n", " [0. 0. 0. 0.]\n", " [0. 0. 0. 0.]\n", " [0. 0. 0. 0.]]\n" ] } ], "source": [ "zero_vector = np.zeros(10) #vector of length 10\n", "zero_matrix = np.zeros((4,4)) #4 by 4 matrix\n", "print(\"The zero vector:\",zero_vector)\n", "print(\"The zero matrix\\n\",zero_matrix)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 121 }, "colab_type": "code", "executionInfo": { "elapsed": 333, "status": "ok", "timestamp": 1548343636748, "user": { "displayName": "Alexander Dowling", "photoUrl": "https://lh3.googleusercontent.com/-LChdQ2m5OQE/AAAAAAAAAAI/AAAAAAAAAA0/JeXJe4vQJ7M/s64/photo.jpg", "userId": "00988067626794866502" }, "user_tz": 300 }, "id": "qCuLqbNdqnWn", "nbpages": { "level": 3, "link": "[1.6.2.2 Creating Arrays in Neat Ways](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.2-Creating-Arrays-in-Neat-Ways)", "section": "1.6.2.2 Creating Arrays in Neat Ways" }, "outputId": "20ecf097-ed49-4f6c-93bd-333a40847912" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The ones vector: [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]\n", "The ones matrix\n", " [[1. 1. 1. 1.]\n", " [1. 1. 1. 1.]\n", " [1. 1. 1. 1.]\n", " [1. 1. 1. 1.]]\n" ] } ], "source": [ "ones_vector = np.ones(10) #vector of length 10\n", "ones_matrix = np.ones((4,4)) #4 by 4 matrix\n", "print(\"The ones vector:\",ones_vector)\n", "print(\"The ones matrix\\n\",ones_matrix)" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 3, "link": "[1.6.2.2 Creating Arrays in Neat Ways](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.2-Creating-Arrays-in-Neat-Ways)", "section": "1.6.2.2 Creating Arrays in Neat Ways" } }, "source": [ "
\n", "Home Activity: Create a 6 by 5 matrix of zeros and store in variable zeros65\n", "
" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": true, "nbpages": { "level": 3, "link": "[1.6.2.2 Creating Arrays in Neat Ways](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.2-Creating-Arrays-in-Neat-Ways)", "section": "1.6.2.2 Creating Arrays in Neat Ways" } }, "outputs": [], "source": [ "# YOUR SOLUTION HERE" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": true, "nbgrader": { "grade": true, "grade_id": "3a-ii", "locked": true, "points": "0.1", "solution": false }, "nbpages": { "level": 3, "link": "[1.6.2.2 Creating Arrays in Neat Ways](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.2-Creating-Arrays-in-Neat-Ways)", "section": "1.6.2.2 Creating Arrays in Neat Ways" } }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "hqKBQjH9qnWp", "nbpages": { "level": 3, "link": "[1.6.2.2 Creating Arrays in Neat Ways](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.2-Creating-Arrays-in-Neat-Ways)", "section": "1.6.2.2 Creating Arrays in Neat Ways" } }, "source": [ "You can also create an array with random entries between 0 and 1:" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 208 }, "colab_type": "code", "executionInfo": { "elapsed": 343, "status": "ok", "timestamp": 1548343660535, "user": { "displayName": "Alexander Dowling", "photoUrl": "https://lh3.googleusercontent.com/-LChdQ2m5OQE/AAAAAAAAAAI/AAAAAAAAAA0/JeXJe4vQJ7M/s64/photo.jpg", "userId": "00988067626794866502" }, "user_tz": 300 }, "id": "KcQnY8S_qnWq", "nbpages": { "level": 3, "link": "[1.6.2.2 Creating Arrays in Neat Ways](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.2-Creating-Arrays-in-Neat-Ways)", "section": "1.6.2.2 Creating Arrays in Neat Ways" }, "outputId": "e8e01911-c62d-4bf8-b654-ff38e834d7f9" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Here's a random 2 x 3 matrix\n", " [[0.94875575 0.25466422 0.93693155]\n", " [0.96635427 0.41600105 0.79932228]]\n", "\n", "Another example\n", "[[ 1.81257083 4.12154316 -0.49858544]\n", " [ 5.1941563 3.91335452 -3.18464743]\n", " [ 4.09537986 2.175721 3.15271181]]\n", "\n", "A third example\n", "[2 2 2 2 4 2 2 4 3 2]\n" ] } ], "source": [ "random_matrix = np.random.rand(2,3) #random 2 x 3 matrix\n", "print(\"Here's a random 2 x 3 matrix\\n\",random_matrix)\n", "\n", "print(\"\\nAnother example\")\n", "\n", "#make a random array between two numbers\n", "print(np.random.uniform(low=-5,high=6,size=(3,3)))\n", "\n", "#make random integers\n", "\n", "print(\"\\nA third example\")\n", "print(np.random.randint(low=1,high=6,size=10))" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "jUy0074FqnWt", "nbpages": { "level": 3, "link": "[1.6.2.2 Creating Arrays in Neat Ways](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.2-Creating-Arrays-in-Neat-Ways)", "section": "1.6.2.2 Creating Arrays in Neat Ways" } }, "source": [ "Finally, you may want to create an **identity matrix**:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 69 }, "colab_type": "code", "executionInfo": { "elapsed": 212, "status": "ok", "timestamp": 1548343714058, "user": { "displayName": "Alexander Dowling", "photoUrl": "https://lh3.googleusercontent.com/-LChdQ2m5OQE/AAAAAAAAAAI/AAAAAAAAAA0/JeXJe4vQJ7M/s64/photo.jpg", "userId": "00988067626794866502" }, "user_tz": 300 }, "id": "KV_RJJ51qnWt", "nbpages": { "level": 3, "link": "[1.6.2.2 Creating Arrays in Neat Ways](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.2-Creating-Arrays-in-Neat-Ways)", "section": "1.6.2.2 Creating Arrays in Neat Ways" }, "outputId": "3324d107-50ce-4757-df80-fdb72b73d49b" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[1. 0. 0.]\n", " [0. 1. 0.]\n", " [0. 0. 1.]]\n" ] } ], "source": [ "#3 x 3 identity matrix\n", "identity33 = np.identity(3)\n", "print(identity33)" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 3, "link": "[1.6.2.2 Creating Arrays in Neat Ways](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.2-Creating-Arrays-in-Neat-Ways)", "section": "1.6.2.2 Creating Arrays in Neat Ways" } }, "source": [ "
\n", "Home Activity: Read the documentation for vstack and hstack. Then create the following array in Python and store it in variable M. Hint: How can you use vstack, identity, and zeros together?\n", "
" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 3, "link": "[1.6.2.2 Creating Arrays in Neat Ways](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.2-Creating-Arrays-in-Neat-Ways)", "section": "1.6.2.2 Creating Arrays in Neat Ways" } }, "source": [ "https://docs.scipy.org/doc/numpy/reference/generated/numpy.vstack.html\n", "\n", "https://docs.scipy.org/doc/numpy/reference/generated/numpy.hstack.html\n", "\n", "$$ M = \\begin{bmatrix} 1 & 0 & 0 \\\\ 0 & 1 & 0 \\\\ 0 & 0 & 1 \\\\ 0 & 0 & 0 \\end{bmatrix}$$" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "nbpages": { "level": 3, "link": "[1.6.2.2 Creating Arrays in Neat Ways](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.2-Creating-Arrays-in-Neat-Ways)", "section": "1.6.2.2 Creating Arrays in Neat Ways" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[1. 0. 0.]\n", " [0. 1. 0.]\n", " [0. 0. 1.]\n", " [0. 0. 0.]]\n" ] } ], "source": [ "# YOUR SOLUTION HERE" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": true, "nbgrader": { "grade": true, "grade_id": "3a-ii-2", "locked": true, "points": "0.2", "solution": false }, "nbpages": { "level": 3, "link": "[1.6.2.2 Creating Arrays in Neat Ways](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.2-Creating-Arrays-in-Neat-Ways)", "section": "1.6.2.2 Creating Arrays in Neat Ways" } }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "xCRFBLk3qnWw", "nbpages": { "level": 3, "link": "[1.6.2.3 Operations on Arrays](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.3-Operations-on-Arrays)", "section": "1.6.2.3 Operations on Arrays" } }, "source": [ "### 1.6.2.3 Operations on Arrays" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "GraFJMdEqnWx", "nbpages": { "level": 3, "link": "[1.6.2.3 Operations on Arrays](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.3-Operations-on-Arrays)", "section": "1.6.2.3 Operations on Arrays" } }, "source": [ "NumPy also defines arithmetic operations mostly in the way that you would expect." ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 52 }, "colab_type": "code", "executionInfo": { "elapsed": 204, "status": "ok", "timestamp": 1548343730530, "user": { "displayName": "Alexander Dowling", "photoUrl": "https://lh3.googleusercontent.com/-LChdQ2m5OQE/AAAAAAAAAAI/AAAAAAAAAA0/JeXJe4vQJ7M/s64/photo.jpg", "userId": "00988067626794866502" }, "user_tz": 300 }, "id": "2g3FZI5YqnWy", "nbpages": { "level": 3, "link": "[1.6.2.3 Operations on Arrays](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.3-Operations-on-Arrays)", "section": "1.6.2.3 Operations on Arrays" }, "outputId": "0209954a-a50d-4fbc-bd06-70a3d698052d" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1. 1. 1.] + [2. 2. 2.] = [3. 3. 3.]\n", "[1. 1. 1.] - [2. 2. 2.] = [-1. -1. -1.]\n" ] } ], "source": [ "#vector addition\n", "x = np.ones(3) #3-vector of ones\n", "y = 3*np.ones(3)-1 #3-vector of 2's\n", "print(x,\"+\",y,\"=\",x+y)\n", "print(x,\"-\",y,\"=\",x-y)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "n29Tiqq_qnW1", "nbpages": { "level": 3, "link": "[1.6.2.3 Operations on Arrays](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.3-Operations-on-Arrays)", "section": "1.6.2.3 Operations on Arrays" } }, "source": [ "Multiplication and division are **element-wise**, which may not be what you expect, but it is helpful." ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 35 }, "colab_type": "code", "executionInfo": { "elapsed": 201, "status": "ok", "timestamp": 1548343776806, "user": { "displayName": "Alexander Dowling", "photoUrl": "https://lh3.googleusercontent.com/-LChdQ2m5OQE/AAAAAAAAAAI/AAAAAAAAAA0/JeXJe4vQJ7M/s64/photo.jpg", "userId": "00988067626794866502" }, "user_tz": 300 }, "id": "hZbLj-Dpew9y", "nbpages": { "level": 3, "link": "[1.6.2.3 Operations on Arrays](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.3-Operations-on-Arrays)", "section": "1.6.2.3 Operations on Arrays" }, "outputId": "7245a56f-aec8-409e-a827-980b7c6b9097" }, "outputs": [ { "data": { "text/plain": [ "array([1., 1., 1.])" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 52 }, "colab_type": "code", "executionInfo": { "elapsed": 222, "status": "ok", "timestamp": 1548343801013, "user": { "displayName": "Alexander Dowling", "photoUrl": "https://lh3.googleusercontent.com/-LChdQ2m5OQE/AAAAAAAAAAI/AAAAAAAAAA0/JeXJe4vQJ7M/s64/photo.jpg", "userId": "00988067626794866502" }, "user_tz": 300 }, "id": "OH1vp8BGqnW1", "nbpages": { "level": 3, "link": "[1.6.2.3 Operations on Arrays](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.3-Operations-on-Arrays)", "section": "1.6.2.3 Operations on Arrays" }, "outputId": "b2059c9b-1bae-4f76-a5ac-8754b686f6f9" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1. 1. 1.] * [1. 2. 3.] = [1. 2. 3.]\n", "[1. 1. 1.] / [1. 2. 3.] = [1. 0.5 0.33333333]\n" ] } ], "source": [ "y = np.array([1.0,2.0,3.0])\n", "print(x,\"*\",y,\"=\",x*y)\n", "print(x,\"/\",y,\"=\",x/y)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "w_yJLYUBqnW3", "nbpages": { "level": 3, "link": "[1.6.2.3 Operations on Arrays](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.3-Operations-on-Arrays)", "section": "1.6.2.3 Operations on Arrays" } }, "source": [ "If you want the dot product, you have to use the ``dot`` function:" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 35 }, "colab_type": "code", "executionInfo": { "elapsed": 346, "status": "ok", "timestamp": 1548343828062, "user": { "displayName": "Alexander Dowling", "photoUrl": "https://lh3.googleusercontent.com/-LChdQ2m5OQE/AAAAAAAAAAI/AAAAAAAAAA0/JeXJe4vQJ7M/s64/photo.jpg", "userId": "00988067626794866502" }, "user_tz": 300 }, "id": "9-RhhCHiqnW4", "nbpages": { "level": 3, "link": "[1.6.2.3 Operations on Arrays](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.3-Operations-on-Arrays)", "section": "1.6.2.3 Operations on Arrays" }, "outputId": "79f0a300-5f36-461b-dbfd-e6c576d1f641" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1. 1. 1.] . [1. 2. 3.] = 6.0\n" ] } ], "source": [ "print(x,\".\",y,\"=\",np.dot(x,y))" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "klxdPqmDqnW6", "nbpages": { "level": 3, "link": "[1.6.2.3 Operations on Arrays](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.3-Operations-on-Arrays)", "section": "1.6.2.3 Operations on Arrays" } }, "source": [ "
\n", "Home Activity: Predict what will happen when you run the code below.\n", "
" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 201 }, "colab_type": "code", "executionInfo": { "elapsed": 232, "status": "error", "timestamp": 1548343902255, "user": { "displayName": "Alexander Dowling", "photoUrl": "https://lh3.googleusercontent.com/-LChdQ2m5OQE/AAAAAAAAAAI/AAAAAAAAAA0/JeXJe4vQJ7M/s64/photo.jpg", "userId": "00988067626794866502" }, "user_tz": 300 }, "id": "aoX1sCuyqnW7", "nbpages": { "level": 3, "link": "[1.6.2.3 Operations on Arrays](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.3-Operations-on-Arrays)", "section": "1.6.2.3 Operations on Arrays" }, "outputId": "7ec967d8-8a37-4871-fd05-95bb8d61a90b" }, "outputs": [ { "ename": "ValueError", "evalue": "operands could not be broadcast together with shapes (3,) (4,) ", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mx\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;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2.5\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0my\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;36m4\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m6\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m7\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m9.0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mValueError\u001b[0m: operands could not be broadcast together with shapes (3,) (4,) " ] } ], "source": [ "x = np.array([1,2.5,5])\n", "y = np.array([4,6,7,9.0])\n", "print(x+y)" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 3, "link": "[1.6.2.3 Operations on Arrays](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.3-Operations-on-Arrays)", "section": "1.6.2.3 Operations on Arrays" } }, "source": [ "
\n", "Home Activity: Write a sentence with at least 50 characters describing why the behavor you observed makes sense. If it does not make sense, write out the question you will ask in class. Store your answer in the string my_answer.\n", "
" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": true, "nbgrader": { "grade": false, "grade_id": "3a-iii", "locked": false, "points": "0.1", "solution": false }, "nbpages": { "level": 3, "link": "[1.6.2.3 Operations on Arrays](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.3-Operations-on-Arrays)", "section": "1.6.2.3 Operations on Arrays" } }, "outputs": [], "source": [ "my_answer = 'ehferbgrweavurebfvbidbv oisrevfbsrwiuevbgirwosgbvisbv . wefigwiuegfiuw'" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": true, "nbgrader": { "grade": true, "grade_id": "3a-iii", "locked": true, "points": "0.1", "solution": false }, "nbpages": { "level": 3, "link": "[1.6.2.3 Operations on Arrays](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.3-Operations-on-Arrays)", "section": "1.6.2.3 Operations on Arrays" } }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "1HXrgdw0qnW9", "nbpages": { "level": 3, "link": "[1.6.2.3 Operations on Arrays](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.3-Operations-on-Arrays)", "section": "1.6.2.3 Operations on Arrays" } }, "source": [ "Matrices work about the same way" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 225 }, "colab_type": "code", "executionInfo": { "elapsed": 219, "status": "ok", "timestamp": 1548343950961, "user": { "displayName": "Alexander Dowling", "photoUrl": "https://lh3.googleusercontent.com/-LChdQ2m5OQE/AAAAAAAAAAI/AAAAAAAAAA0/JeXJe4vQJ7M/s64/photo.jpg", "userId": "00988067626794866502" }, "user_tz": 300 }, "id": "JOI-vxI-qnW9", "nbpages": { "level": 3, "link": "[1.6.2.3 Operations on Arrays](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.3-Operations-on-Arrays)", "section": "1.6.2.3 Operations on Arrays" }, "outputId": "1bba5ef2-a954-4aea-fcbd-30bd44ac0c44" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The sum of\n", " [[1. 0. 0.]\n", " [0. 1. 0.]\n", " [0. 0. 1.]] \n", "and\n", " [[1 2 3]\n", " [1 2 3]\n", " [1 2 3]] \n", "is\n", " [[2. 2. 3.]\n", " [1. 3. 3.]\n", " [1. 2. 4.]]\n" ] } ], "source": [ "silly_matrix = np.array([(1,2,3),(1,2,3),(1,2,3)])\n", "print(\"The sum of\\n\",identity33,\"\\nand\\n\",\n", " silly_matrix,\"\\nis\\n\",identity33+silly_matrix)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "Ah5uzq2rqnXA", "nbpages": { "level": 3, "link": "[1.6.2.3 Operations on Arrays](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.3-Operations-on-Arrays)", "section": "1.6.2.3 Operations on Arrays" } }, "source": [ "Multiplication and division are **element-wise**:" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 69 }, "colab_type": "code", "executionInfo": { "elapsed": 293, "status": "ok", "timestamp": 1548343964546, "user": { "displayName": "Alexander Dowling", "photoUrl": "https://lh3.googleusercontent.com/-LChdQ2m5OQE/AAAAAAAAAAI/AAAAAAAAAA0/JeXJe4vQJ7M/s64/photo.jpg", "userId": "00988067626794866502" }, "user_tz": 300 }, "id": "nBn4HpXfqnXA", "nbpages": { "level": 3, "link": "[1.6.2.3 Operations on Arrays](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.3-Operations-on-Arrays)", "section": "1.6.2.3 Operations on Arrays" }, "outputId": "2c8f437b-4987-46c3-9a7f-2fecbd950051" }, "outputs": [ { "data": { "text/plain": [ "array([[1., 0., 0.],\n", " [0., 2., 0.],\n", " [0., 0., 3.]])" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "identity33 * silly_matrix" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 69 }, "colab_type": "code", "executionInfo": { "elapsed": 328, "status": "ok", "timestamp": 1548343973710, "user": { "displayName": "Alexander Dowling", "photoUrl": "https://lh3.googleusercontent.com/-LChdQ2m5OQE/AAAAAAAAAAI/AAAAAAAAAA0/JeXJe4vQJ7M/s64/photo.jpg", "userId": "00988067626794866502" }, "user_tz": 300 }, "id": "wHqQo7swqnXD", "nbpages": { "level": 3, "link": "[1.6.2.3 Operations on Arrays](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.3-Operations-on-Arrays)", "section": "1.6.2.3 Operations on Arrays" }, "outputId": "686b0f0b-69fa-41d2-9ae3-ce9e27b3d2a6" }, "outputs": [ { "data": { "text/plain": [ "array([[1. , 0. , 0. ],\n", " [0. , 0.5 , 0. ],\n", " [0. , 0. , 0.33333333]])" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "identity33 / silly_matrix" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "gcY69xxHqnXF", "nbpages": { "level": 3, "link": "[1.6.2.3 Operations on Arrays](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.3-Operations-on-Arrays)", "section": "1.6.2.3 Operations on Arrays" } }, "source": [ "The ``dot`` function will give you the **matrix product**:" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 225 }, "colab_type": "code", "executionInfo": { "elapsed": 204, "status": "ok", "timestamp": 1548343990589, "user": { "displayName": "Alexander Dowling", "photoUrl": "https://lh3.googleusercontent.com/-LChdQ2m5OQE/AAAAAAAAAAI/AAAAAAAAAA0/JeXJe4vQJ7M/s64/photo.jpg", "userId": "00988067626794866502" }, "user_tz": 300 }, "id": "HBtGWBd7qnXG", "nbpages": { "level": 3, "link": "[1.6.2.3 Operations on Arrays](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.3-Operations-on-Arrays)", "section": "1.6.2.3 Operations on Arrays" }, "outputId": "e56e89a6-1202-4a1e-e04a-96544da9aba8" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The matrix product of\n", " [[1. 0. 0.]\n", " [0. 1. 0.]\n", " [0. 0. 1.]] \n", "and\n", " [[1 2 3]\n", " [1 2 3]\n", " [1 2 3]] \n", "is\n", " [[1. 2. 3.]\n", " [1. 2. 3.]\n", " [1. 2. 3.]]\n" ] } ], "source": [ "print(\"The matrix product of\\n\",identity33,\n", " \"\\nand\\n\",silly_matrix,\"\\nis\\n\",np.dot(identity33,silly_matrix))" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 87 }, "colab_type": "code", "executionInfo": { "elapsed": 220, "status": "ok", "timestamp": 1548344044425, "user": { "displayName": "Alexander Dowling", "photoUrl": "https://lh3.googleusercontent.com/-LChdQ2m5OQE/AAAAAAAAAAI/AAAAAAAAAA0/JeXJe4vQJ7M/s64/photo.jpg", "userId": "00988067626794866502" }, "user_tz": 300 }, "id": "ZHBFcLjLqnXI", "nbpages": { "level": 3, "link": "[1.6.2.3 Operations on Arrays](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.3-Operations-on-Arrays)", "section": "1.6.2.3 Operations on Arrays" }, "outputId": "19b1e457-4163-4ad4-8a37-19f17cbf240d" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[1 2 3]\n", " [1 2 3]\n", " [1 2 3]] times [1. 2. 3.] is\n", "[14. 14. 14.]\n" ] } ], "source": [ "#matrix times a vector\n", "y = np.array([1.0,2.0,3.0])\n", "print(silly_matrix,\"times\", y, \"is\")\n", "print(np.dot(silly_matrix,y))" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 3, "link": "[1.6.2.3 Operations on Arrays](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.3-Operations-on-Arrays)", "section": "1.6.2.3 Operations on Arrays" } }, "source": [ "Writing `np.dot` can get tedious. You can also use the `@` symbol for matrix multiplication:" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "nbpages": { "level": 3, "link": "[1.6.2.3 Operations on Arrays](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.3-Operations-on-Arrays)", "section": "1.6.2.3 Operations on Arrays" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[14. 14. 14.]\n" ] } ], "source": [ "print(silly_matrix @ y)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "0b7S8aRkqnXL", "nbpages": { "level": 3, "link": "[1.6.2.4 Universal Functions](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.4-Universal-Functions)", "section": "1.6.2.4 Universal Functions" } }, "source": [ "### 1.6.2.4 Universal Functions" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "Bf4iXE3aqnXL", "nbpages": { "level": 3, "link": "[1.6.2.4 Universal Functions](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.4-Universal-Functions)", "section": "1.6.2.4 Universal Functions" } }, "source": [ "NumPy also provides universal functions that operate on each element of an array. Common mathematical functions are defined in this way." ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 520 }, "colab_type": "code", "executionInfo": { "elapsed": 204, "status": "ok", "timestamp": 1548344065989, "user": { "displayName": "Alexander Dowling", "photoUrl": "https://lh3.googleusercontent.com/-LChdQ2m5OQE/AAAAAAAAAAI/AAAAAAAAAA0/JeXJe4vQJ7M/s64/photo.jpg", "userId": "00988067626794866502" }, "user_tz": 300 }, "id": "hp-q82PDqnXM", "nbpages": { "level": 3, "link": "[1.6.2.4 Universal Functions](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.4-Universal-Functions)", "section": "1.6.2.4 Universal Functions" }, "outputId": "75fd0030-641b-4d14-e0c1-4b93e8df3bf3" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0. 0.10300304 0.20600608 0.30900911 0.41201215 0.51501519\n", " 0.61801823 0.72102126 0.8240243 0.92702734 1.03003038 1.13303342\n", " 1.23603645 1.33903949 1.44204253 1.54504557 1.64804861 1.75105164\n", " 1.85405468 1.95705772 2.06006076 2.16306379 2.26606683 2.36906987\n", " 2.47207291 2.57507595 2.67807898 2.78108202 2.88408506 2.9870881\n", " 3.09009113 3.19309417 3.29609721 3.39910025 3.50210329 3.60510632\n", " 3.70810936 3.8111124 3.91411544 4.01711848 4.12012151 4.22312455\n", " 4.32612759 4.42913063 4.53213366 4.6351367 4.73813974 4.84114278\n", " 4.94414582 5.04714885 5.15015189 5.25315493 5.35615797 5.459161\n", " 5.56216404 5.66516708 5.76817012 5.87117316 5.97417619 6.07717923\n", " 6.18018227 6.28318531]\n", "\n", "\n", "[ 0.00000000e+00 1.02820997e-01 2.04552066e-01 3.04114832e-01\n", " 4.00453906e-01 4.92548068e-01 5.79421098e-01 6.60152121e-01\n", " 7.33885366e-01 7.99839245e-01 8.57314628e-01 9.05702263e-01\n", " 9.44489229e-01 9.73264374e-01 9.91722674e-01 9.99668468e-01\n", " 9.97017526e-01 9.83797952e-01 9.60149874e-01 9.26323968e-01\n", " 8.82678798e-01 8.29677014e-01 7.67880446e-01 6.97944155e-01\n", " 6.20609482e-01 5.36696194e-01 4.47093793e-01 3.52752087e-01\n", " 2.54671120e-01 1.53890577e-01 5.14787548e-02 -5.14787548e-02\n", " -1.53890577e-01 -2.54671120e-01 -3.52752087e-01 -4.47093793e-01\n", " -5.36696194e-01 -6.20609482e-01 -6.97944155e-01 -7.67880446e-01\n", " -8.29677014e-01 -8.82678798e-01 -9.26323968e-01 -9.60149874e-01\n", " -9.83797952e-01 -9.97017526e-01 -9.99668468e-01 -9.91722674e-01\n", " -9.73264374e-01 -9.44489229e-01 -9.05702263e-01 -8.57314628e-01\n", " -7.99839245e-01 -7.33885366e-01 -6.60152121e-01 -5.79421098e-01\n", " -4.92548068e-01 -4.00453906e-01 -3.04114832e-01 -2.04552066e-01\n", " -1.02820997e-01 -2.44929360e-16]\n" ] } ], "source": [ "#recall we defined X as a linspace from 0 to 2pi\n", "print(X)\n", "\n", "# Print an empty line\n", "print(\"\\n\")\n", "\n", "#taking the sin(X) should be one whole sine wave\n", "print(np.sin(X))" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 265 }, "colab_type": "code", "executionInfo": { "elapsed": 323, "status": "ok", "timestamp": 1548344086517, "user": { "displayName": "Alexander Dowling", "photoUrl": "https://lh3.googleusercontent.com/-LChdQ2m5OQE/AAAAAAAAAAI/AAAAAAAAAA0/JeXJe4vQJ7M/s64/photo.jpg", "userId": "00988067626794866502" }, "user_tz": 300 }, "id": "GDq7eQ_7qnXR", "nbpages": { "level": 3, "link": "[1.6.2.4 Universal Functions](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.4-Universal-Functions)", "section": "1.6.2.4 Universal Functions" }, "outputId": "e52e1404-5f60-448d-aae1-07b334dab3aa" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "#the next line is only needed in iPython notebooks\n", "%matplotlib inline\n", "\n", "# Create a plot. We'll learn more about this below\n", "plt.plot(X,np.sin(X));\n", "plt.axis([0,2*np.pi,-1.05,1.05])\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 3, "link": "[1.6.2.4 Universal Functions](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.4-Universal-Functions)", "section": "1.6.2.4 Universal Functions" } }, "source": [ "
\n", "Home Activity: Copy the code from above to below. Then modify to plot cosine instead of sine.\n", "
" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "nbpages": { "level": 3, "link": "[1.6.2.4 Universal Functions](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.4-Universal-Functions)", "section": "1.6.2.4 Universal Functions" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "#the next line is only needed in iPython notebooks\n", "%matplotlib inline\n", "\n", "# Create a plot. We'll learn more about this below\n", "plt.plot(X,np.cos(X));\n", "plt.axis([0,2*np.pi,-1.05,1.05])\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "hVTWyRgyqnXT", "nbpages": { "level": 3, "link": "[1.6.2.5 Copying Arrays](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.5-Copying-Arrays)", "section": "1.6.2.5 Copying Arrays" } }, "source": [ "### 1.6.2.5 Copying Arrays" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "8YOPAODoqnXU", "nbpages": { "level": 3, "link": "[1.6.2.5 Copying Arrays](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.5-Copying-Arrays)", "section": "1.6.2.5 Copying Arrays" } }, "source": [ "When you assign a new variable name to an existing array, it is the same as giving two names for the object." ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 69 }, "colab_type": "code", "executionInfo": { "elapsed": 210, "status": "ok", "timestamp": 1548344168698, "user": { "displayName": "Alexander Dowling", "photoUrl": "https://lh3.googleusercontent.com/-LChdQ2m5OQE/AAAAAAAAAAI/AAAAAAAAAA0/JeXJe4vQJ7M/s64/photo.jpg", "userId": "00988067626794866502" }, "user_tz": 300 }, "id": "_VLZmvJ1qnXU", "nbpages": { "level": 3, "link": "[1.6.2.5 Copying Arrays](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.5-Copying-Arrays)", "section": "1.6.2.5 Copying Arrays" }, "outputId": "32ade637-630b-4228-dfa3-a7e52a7e7070" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1. 2. 3. 4. 5. 6.]\n", "The value of array a is [1. 2. 2.56 4. 5. 6. ]\n", "The value of array b is [1. 2. 2.56 4. 5. 6. ]\n" ] } ], "source": [ "a = np.array([1.0,2,3,4,5,6])\n", "print(a)\n", "b = a # this will make a and b different names for the same array\n", "b[2] = 2.56 #change b at position 2, also changes a\n", "print(\"The value of array a is\",a)\n", "print(\"The value of array b is\",b)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "XYqm-VtwqnXW", "nbpages": { "level": 3, "link": "[1.6.2.5 Copying Arrays](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.5-Copying-Arrays)", "section": "1.6.2.5 Copying Arrays" } }, "source": [ "**Warning to MATLAB users:** MATLAB would not change `a` with the assignment `b[2] = 2.56`. Python and MATLAB behave differently in this respect." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "Kc0trDOTqnXW", "nbpages": { "level": 3, "link": "[1.6.2.5 Copying Arrays](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.5-Copying-Arrays)", "section": "1.6.2.5 Copying Arrays" } }, "source": [ "When you pass an array to a function, the **function does not copy the array**, it just assigns that array another name as in the previous example." ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 52 }, "colab_type": "code", "executionInfo": { "elapsed": 201, "status": "ok", "timestamp": 1548344340250, "user": { "displayName": "Alexander Dowling", "photoUrl": "https://lh3.googleusercontent.com/-LChdQ2m5OQE/AAAAAAAAAAI/AAAAAAAAAA0/JeXJe4vQJ7M/s64/photo.jpg", "userId": "00988067626794866502" }, "user_tz": 300 }, "id": "pRQtdHjVgt-y", "nbpages": { "level": 3, "link": "[1.6.2.5 Copying Arrays](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.5-Copying-Arrays)", "section": "1.6.2.5 Copying Arrays" }, "outputId": "77740348-970f-40de-9314-d622186b66c9" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['apples', 'grapes']\n", "['apples', 'grapes']\n" ] } ], "source": [ "a1 = [\"apples\",\"oranges\"]\n", "b1 = a1\n", "b1[1] = \"grapes\"\n", "print(a1)\n", "print(b1)" ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 52 }, "colab_type": "code", "executionInfo": { "elapsed": 357, "status": "ok", "timestamp": 1548344407228, "user": { "displayName": "Alexander Dowling", "photoUrl": "https://lh3.googleusercontent.com/-LChdQ2m5OQE/AAAAAAAAAAI/AAAAAAAAAA0/JeXJe4vQJ7M/s64/photo.jpg", "userId": "00988067626794866502" }, "user_tz": 300 }, "id": "adRTQkiYqnXX", "nbpages": { "level": 3, "link": "[1.6.2.5 Copying Arrays](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.5-Copying-Arrays)", "section": "1.6.2.5 Copying Arrays" }, "outputId": "42e7a8eb-0120-4bcc-c0e5-edf1e99207a4" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Before the function a = [1. 2. 3. 4. 5. 6.]\n", "After the function a = [-1.e+06 2.e+00 3.e+00 4.e+00 5.e+00 6.e+00]\n" ] } ], "source": [ "def devious_function(func_array):\n", " func_array[0] = -1.0e6 #changes the value of array passed in\n", "\n", "a = np.array([1.0,2,3,4,5,6])\n", "print(\"Before the function a =\",a)\n", "devious_function(a)\n", "print(\"After the function a =\",a)" ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "colab": {}, "colab_type": "code", "id": "MiRZy2-JqnXY", "nbpages": { "level": 3, "link": "[1.6.2.5 Copying Arrays](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.5-Copying-Arrays)", "section": "1.6.2.5 Copying Arrays" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Before the function a = 1\n", "After the function a = 1\n" ] } ], "source": [ "def less_devious_function(func_float):\n", " func_float = 9.9 #changes local copy of func_float\n", "a = 1\n", "print(\"Before the function a =\",a)\n", "less_devious_function(a)\n", "print(\"After the function a =\",a)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "UN4PzE8SqnXb", "nbpages": { "level": 3, "link": "[1.6.2.5 Copying Arrays](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.5-Copying-Arrays)", "section": "1.6.2.5 Copying Arrays" } }, "source": [ "This is different than what we saw previously for passing floats, integers, booleans, and strings to functions. \n", "\n", "*Why would Python do this, besides to just confuse me!?!* you ask.\n", "\n", "Imagine a NumPy array has millions of elements. It is best for efficient memory usage if functions do not make multiple copies of millions of elements.\n", "\n", "**Summary:**\n", "* Floats, integers, booleans, strings: You do NOT need to worry about `.copy()`. These are called primative types in Python.\n", "* Lists, arrays, dictionaries, and anything else. You need to worry about `.copy()`." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "y6rzcT2JqnXb", "nbpages": { "level": 3, "link": "[1.6.2.5 Copying Arrays](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.5-Copying-Arrays)", "section": "1.6.2.5 Copying Arrays" } }, "source": [ "To make a real copy of the entire elements of an array you need to use the ``copy`` function on the array." ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 104 }, "colab_type": "code", "executionInfo": { "elapsed": 204, "status": "ok", "timestamp": 1548344479604, "user": { "displayName": "Alexander Dowling", "photoUrl": "https://lh3.googleusercontent.com/-LChdQ2m5OQE/AAAAAAAAAAI/AAAAAAAAAA0/JeXJe4vQJ7M/s64/photo.jpg", "userId": "00988067626794866502" }, "user_tz": 300 }, "id": "tpYzdb_lqnXb", "nbpages": { "level": 3, "link": "[1.6.2.5 Copying Arrays](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.5-Copying-Arrays)", "section": "1.6.2.5 Copying Arrays" }, "outputId": "5d41357c-4a5e-4bd7-8d36-1648d21c38fe" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1. 2. 3. 4. 5. 6.]\n", "\n", "The value of array a is [1. 2. 3. 4. 5. 6.]\n", "\n", "The value of array b is [1. 2. 2.56 4. 5. 6. ]\n" ] } ], "source": [ "a = np.array([1.0,2,3,4,5,6])\n", "print(a)\n", "#this will make a and b different copies for the same array\n", "b = a.copy()\n", "b[2] = 2.56 #change b at position 2, will not change a\n", "print(\"\\nThe value of array a is\",a)\n", "print(\"\\nThe value of array b is\",b)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "9CTmfuN6qnXe", "nbpages": { "level": 3, "link": "[1.6.2.6 Indexing, Slicing, and Iterating](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.6-Indexing,-Slicing,-and-Iterating)", "section": "1.6.2.6 Indexing, Slicing, and Iterating" } }, "source": [ "### 1.6.2.6 Indexing, Slicing, and Iterating" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "ipsRPDgVqnXf", "nbpages": { "level": 3, "link": "[1.6.2.6 Indexing, Slicing, and Iterating](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.6-Indexing,-Slicing,-and-Iterating)", "section": "1.6.2.6 Indexing, Slicing, and Iterating" } }, "source": [ "Oftentimes we'll want to access more than one element of an array at a time. We can do this by slicing." ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 277 }, "colab_type": "code", "executionInfo": { "elapsed": 222, "status": "ok", "timestamp": 1548344534273, "user": { "displayName": "Alexander Dowling", "photoUrl": "https://lh3.googleusercontent.com/-LChdQ2m5OQE/AAAAAAAAAAI/AAAAAAAAAA0/JeXJe4vQJ7M/s64/photo.jpg", "userId": "00988067626794866502" }, "user_tz": 300 }, "id": "bV5MJRapqnXf", "nbpages": { "level": 3, "link": "[1.6.2.6 Indexing, Slicing, and Iterating](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.6-Indexing,-Slicing,-and-Iterating)", "section": "1.6.2.6 Indexing, Slicing, and Iterating" }, "outputId": "bb7d1d87-8d5b-4812-a8a1-fd796f349188" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The vector [1 2 3 4]\n", "\n", "The matrix\n", " [[1 2 3]\n", " [4 5 6]\n", " [7 8 9]]\n", "\n", "a_vector[:] = [1 2 3 4]\n", "\n", "a_vector[1:3] = [2 3]\n", "\n", "For a matrix, we can slice in each dimension\n", "a_matrix[0,:] = [1 2 3]\n", "a_matrix[0,1:3] = [2 3]\n", "a_matrix[:,2] = [3 6 9]\n" ] } ], "source": [ "#bring these guys back\n", "import numpy as np\n", "a_vector = np.array([1,2,3,4])\n", "a_matrix = np.array([(1,2,3),(4,5,6),(7,8,9)])\n", "print(\"The vector\",a_vector)\n", "print(\"\\nThe matrix\\n\",a_matrix)\n", "print(\"\\na_vector[:] =\",a_vector[:]) #single colon gives everything\n", "print(\"\\na_vector[1:3] =\",a_vector[1:3]) #print out position 1 to position 2 (same as for lists)\n", "print(\"\\nFor a matrix, we can slice in each dimension\")\n", "print(\"a_matrix[0,:] =\",a_matrix[0,:]) #every column in row 0\n", "print(\"a_matrix[0,1:3] =\",a_matrix[0,1:3]) #columns 1 and 2 in row 0\n", "print(\"a_matrix[:,2] =\",a_matrix[:,2]) #every row in column 2" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "6XNsdzrnqnXj", "nbpages": { "level": 3, "link": "[1.6.2.6 Indexing, Slicing, and Iterating](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.6-Indexing,-Slicing,-and-Iterating)", "section": "1.6.2.6 Indexing, Slicing, and Iterating" } }, "source": [ "Iteration over a matrix will give you everything in a row:" ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 121 }, "colab_type": "code", "executionInfo": { "elapsed": 210, "status": "ok", "timestamp": 1548344560061, "user": { "displayName": "Alexander Dowling", "photoUrl": "https://lh3.googleusercontent.com/-LChdQ2m5OQE/AAAAAAAAAAI/AAAAAAAAAA0/JeXJe4vQJ7M/s64/photo.jpg", "userId": "00988067626794866502" }, "user_tz": 300 }, "id": "ruKP_2PWqnXj", "nbpages": { "level": 3, "link": "[1.6.2.6 Indexing, Slicing, and Iterating](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.6-Indexing,-Slicing,-and-Iterating)", "section": "1.6.2.6 Indexing, Slicing, and Iterating" }, "outputId": "917eda72-953a-46d0-dc27-a6123fece628" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Row 0 of a_matrix is [1 2 3]\n", "Row 1 of a_matrix is [4 5 6]\n", "Row 2 of a_matrix is [7 8 9]\n", "Column 3 of a_matrix is [1 4 7]\n", "Column 4 of a_matrix is [2 5 8]\n", "Column 5 of a_matrix is [3 6 9]\n" ] } ], "source": [ "a_matrix = np.array([(1,2,3),(4,5,6),(7,8,9)])\n", "count = 0\n", "for i in a_matrix:\n", " print(\"Row\",count,\"of a_matrix is\",i)\n", " count += 1\n", " \n", " \n", "for column in a_matrix.transpose():\n", " print(\"Column\",count,\"of a_matrix is\",column)\n", " count += 1" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "jcCJ-VVIqnXn", "nbpages": { "level": 3, "link": "[1.6.2.6 Indexing, Slicing, and Iterating](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.6-Indexing,-Slicing,-and-Iterating)", "section": "1.6.2.6 Indexing, Slicing, and Iterating" } }, "source": [ "To iterate over every element in the matrix you'll need two for loops:" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 173 }, "colab_type": "code", "executionInfo": { "elapsed": 229, "status": "ok", "timestamp": 1548344618664, "user": { "displayName": "Alexander Dowling", "photoUrl": "https://lh3.googleusercontent.com/-LChdQ2m5OQE/AAAAAAAAAAI/AAAAAAAAAA0/JeXJe4vQJ7M/s64/photo.jpg", "userId": "00988067626794866502" }, "user_tz": 300 }, "id": "ttUGTWlUqnXn", "nbpages": { "level": 3, "link": "[1.6.2.6 Indexing, Slicing, and Iterating](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.6-Indexing,-Slicing,-and-Iterating)", "section": "1.6.2.6 Indexing, Slicing, and Iterating" }, "outputId": "60958d47-d409-4f7d-fc7b-74af51dae59c" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Row 0 Column 0 of a_matrix is 1\n", "Row 0 Column 1 of a_matrix is 2\n", "Row 0 Column 2 of a_matrix is 3\n", "Row 1 Column 0 of a_matrix is 4\n", "Row 1 Column 1 of a_matrix is 5\n", "Row 1 Column 2 of a_matrix is 6\n", "Row 2 Column 0 of a_matrix is 7\n", "Row 2 Column 1 of a_matrix is 8\n", "Row 2 Column 2 of a_matrix is 9\n" ] } ], "source": [ "a_matrix = np.array([(1,2,3),(4,5,6),(7,8,9)])\n", "row_count = 0\n", "col_count = 0\n", "for row in a_matrix:\n", " col_count = 0\n", " for col in row:\n", " print(\"Row\",row_count,\"Column\",col_count,\"of a_matrix is\",col)\n", " col_count += 1\n", " row_count += 1" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 3, "link": "[1.6.2.6 Indexing, Slicing, and Iterating](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.6-Indexing,-Slicing,-and-Iterating)", "section": "1.6.2.6 Indexing, Slicing, and Iterating" } }, "source": [ "
\n", "Home Activity: Using a single for loop, print the diagonal elements of matrix A. Store the diagonal elements in the list diagonal.\n", "
" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 3, "link": "[1.6.2.6 Indexing, Slicing, and Iterating](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.6-Indexing,-Slicing,-and-Iterating)", "section": "1.6.2.6 Indexing, Slicing, and Iterating" } }, "source": [ "Tip: Let `my_list` be a Python list. Remember that `my_list.append(1.0)` will add `1.0` to the list `my_list`." ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 225 }, "colab_type": "code", "executionInfo": { "elapsed": 378, "status": "ok", "timestamp": 1548344631468, "user": { "displayName": "Alexander Dowling", "photoUrl": "https://lh3.googleusercontent.com/-LChdQ2m5OQE/AAAAAAAAAAI/AAAAAAAAAA0/JeXJe4vQJ7M/s64/photo.jpg", "userId": "00988067626794866502" }, "user_tz": 300 }, "id": "6gNN-VfHqnXs", "nbpages": { "level": 3, "link": "[1.6.2.6 Indexing, Slicing, and Iterating](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.6-Indexing,-Slicing,-and-Iterating)", "section": "1.6.2.6 Indexing, Slicing, and Iterating" }, "outputId": "ba2b6582-66d2-4e43-d880-e4f9485aee53" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "A =\n", " [[0.98530512 0.04869325 0.82686032]\n", " [0.401906 0.91142412 0.29288514]\n", " [0.00861273 0.95496269 0.68612047]]\n", "\n", "The diagonal elements of A\n", "0.9853051241512321\n", "0.9114241226071109\n", "0.6861204674649746\n" ] } ], "source": [ "N = 3\n", "A = np.random.rand(N,N)\n", "print(\"A =\\n\",A)\n", "\n", "# create any empty list\n", "diagonal = []\n", "\n", "#print the diagonal of the matrix using a single for loop\n", "print(\"\\nThe diagonal elements of A\")\n", "\n", "# YOUR SOLUTION HERE" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 3, "link": "[1.6.2.6 Indexing, Slicing, and Iterating](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.6-Indexing,-Slicing,-and-Iterating)", "section": "1.6.2.6 Indexing, Slicing, and Iterating" } }, "source": [ "Warning: You need to programmically extract the diagonals. You cannot manually copy them. When the autograder runs, it will generate a new `A` matrix." ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "collapsed": true, "nbgrader": { "grade": true, "grade_id": " 3a-vi", "locked": true, "points": "0.1", "solution": false }, "nbpages": { "level": 3, "link": "[1.6.2.6 Indexing, Slicing, and Iterating](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.6-Indexing,-Slicing,-and-Iterating)", "section": "1.6.2.6 Indexing, Slicing, and Iterating" } }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 3, "link": "[1.6.2.6 Indexing, Slicing, and Iterating](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.6-Indexing,-Slicing,-and-Iterating)", "section": "1.6.2.6 Indexing, Slicing, and Iterating" } }, "source": [ "NumPy also has a built-in function to extract the diagonal of a matrix." ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "nbpages": { "level": 3, "link": "[1.6.2.6 Indexing, Slicing, and Iterating](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.6-Indexing,-Slicing,-and-Iterating)", "section": "1.6.2.6 Indexing, Slicing, and Iterating" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "The diagonal of A as a vector\n", "[0.98530512 0.91142412 0.68612047]\n" ] } ], "source": [ "print(\"\\nThe diagonal of A as a vector\")\n", "print(np.diag(A))" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "kHsSx8OcqnXt", "nbpages": { "level": 3, "link": "[1.6.2.7 Complex Numbers](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.7-Complex-Numbers)", "section": "1.6.2.7 Complex Numbers" } }, "source": [ "### 1.6.2.7 Complex Numbers\n", "Numpy can handle complex numbers, but you need to tell it that you have complex numbers by adding a parameter to the function that creates your array (or matrix, or vector, etc.)." ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 35 }, "colab_type": "code", "executionInfo": { "elapsed": 345, "status": "ok", "timestamp": 1548344651471, "user": { "displayName": "Alexander Dowling", "photoUrl": "https://lh3.googleusercontent.com/-LChdQ2m5OQE/AAAAAAAAAAI/AAAAAAAAAA0/JeXJe4vQJ7M/s64/photo.jpg", "userId": "00988067626794866502" }, "user_tz": 300 }, "id": "5vaw55JSqnXu", "nbpages": { "level": 3, "link": "[1.6.2.7 Complex Numbers](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.7-Complex-Numbers)", "section": "1.6.2.7 Complex Numbers" }, "outputId": "ffd91e02-0a23-4e9a-a555-a451f0e99013" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]\n" ] } ], "source": [ "cArray = np.zeros(5, dtype=\"complex\")\n", "print(cArray)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "xh3Jl6uFqnXx", "nbpages": { "level": 3, "link": "[1.6.2.7 Complex Numbers](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.7-Complex-Numbers)", "section": "1.6.2.7 Complex Numbers" } }, "source": [ "``dtype`` tells NumPy that the array will hold complex numbers. It is not needed if it is obvious you are using complex numbers." ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 35 }, "colab_type": "code", "executionInfo": { "elapsed": 196, "status": "ok", "timestamp": 1548344661173, "user": { "displayName": "Alexander Dowling", "photoUrl": "https://lh3.googleusercontent.com/-LChdQ2m5OQE/AAAAAAAAAAI/AAAAAAAAAA0/JeXJe4vQJ7M/s64/photo.jpg", "userId": "00988067626794866502" }, "user_tz": 300 }, "id": "3YTzrxVzqnXz", "nbpages": { "level": 3, "link": "[1.6.2.7 Complex Numbers](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.7-Complex-Numbers)", "section": "1.6.2.7 Complex Numbers" }, "outputId": "b003e7c0-3579-4c81-c5db-de1101498904" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 1.+1.j -1.+0.j]\n" ] } ], "source": [ "cArray2 = np.array([1+1j,-1])\n", "print(cArray2)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "lNS4UlAiqnX0", "nbpages": { "level": 3, "link": "[1.6.2.7 Complex Numbers](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.7-Complex-Numbers)", "section": "1.6.2.7 Complex Numbers" } }, "source": [ "You must be careful when you manipulate an array of floats into complex numbers, say by taking the square root" ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 87 }, "colab_type": "code", "executionInfo": { "elapsed": 198, "status": "ok", "timestamp": 1548344672586, "user": { "displayName": "Alexander Dowling", "photoUrl": "https://lh3.googleusercontent.com/-LChdQ2m5OQE/AAAAAAAAAAI/AAAAAAAAAA0/JeXJe4vQJ7M/s64/photo.jpg", "userId": "00988067626794866502" }, "user_tz": 300 }, "id": "MOpCrH2HqnX1", "nbpages": { "level": 3, "link": "[1.6.2.7 Complex Numbers](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.7-Complex-Numbers)", "section": "1.6.2.7 Complex Numbers" }, "outputId": "f2bf566d-ef73-4461-e93b-0fd614fad7b7" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Wrong way gives [nan 1.]\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/usr/local/lib/python3.6/site-packages/ipykernel_launcher.py:2: RuntimeWarning: invalid value encountered in sqrt\n", " \n" ] } ], "source": [ "fArray = np.array([-1,1])\n", "print(\"Wrong way gives\", np.sqrt(fArray))" ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "nbpages": { "level": 3, "link": "[1.6.2.7 Complex Numbers](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.7-Complex-Numbers)", "section": "1.6.2.7 Complex Numbers" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Right way gives [0.+1.j 1.+0.j]\n" ] } ], "source": [ "print(\"Right way gives\", np.sqrt(fArray, dtype=\"complex\"))" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "hIS0pUx9qnX3", "nbpages": { "level": 3, "link": "[1.6.2.8 Integrating Everything Together](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.8-Integrating-Everything-Together)", "section": "1.6.2.8 Integrating Everything Together" } }, "source": [ "### 1.6.2.8 Integrating Everything Together" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 3, "link": "[1.6.2.8 Integrating Everything Together](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.8-Integrating-Everything-Together)", "section": "1.6.2.8 Integrating Everything Together" } }, "source": [ "
\n", "Class Activity [handout]: With a partner, predict the output of Python code.\n", "
" ] }, { "cell_type": "code", "execution_count": 55, "metadata": { "nbpages": { "level": 3, "link": "[1.6.2.8 Integrating Everything Together](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.8-Integrating-Everything-Together)", "section": "1.6.2.8 Integrating Everything Together" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "A=\n", " [[1 3]\n", " [2 4]]\n", "\n", "B=\n", " [5 6 7] \n", "\n", "rld\n", "rld!\n", "\n", " x = 1 \n", "\n", "\n", "B = \n", " [3 4 7]\n", "\n", "C = \n", " [3 9 7]\n" ] } ], "source": [ "# YOUR SOLUTION HERE" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 3, "link": "[1.6.2.8 Integrating Everything Together](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.8-Integrating-Everything-Together)", "section": "1.6.2.8 Integrating Everything Together" } }, "source": [ "
\n", "Class Activity: With a partner, create a Python function that does the following:\n", "
" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 3, "link": "[1.6.2.8 Integrating Everything Together](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.8-Integrating-Everything-Together)", "section": "1.6.2.8 Integrating Everything Together" } }, "source": [ "* Takes the size of a matrix, $N$, as the input. Rounds to an integer.\n", "* If $N < 1$, prints a warning message and returns nothing. Otherwise, continues.\n", "* Generates a matrix of size $N \\times N$ filled with random floating point numbers from -5 to 5\n", "* Print the matrix to the screen\n", "* Returns a vector that is the sum of the columns of the matrix" ] }, { "cell_type": "code", "execution_count": 56, "metadata": { "colab": {}, "colab_type": "code", "collapsed": true, "id": "QbMS2I6kqnX5", "nbpages": { "level": 3, "link": "[1.6.2.8 Integrating Everything Together](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.8-Integrating-Everything-Together)", "section": "1.6.2.8 Integrating Everything Together" } }, "outputs": [], "source": [ "def np_activity(N):\n", " '''Generates a random N x N matrix, prints to screen,\n", " and returns a vector that is the sum of the columns.\n", " \n", " Arguments:\n", " YOU NEED TO FILL THIS IN\n", " \n", " Returns:\n", " YOU NEED TO FILL THIS IN\n", " '''" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "0Kc9c8jInvj6", "nbpages": { "level": 3, "link": "[1.6.2.8 Integrating Everything Together](https://ndcbe.github.io/cbe-xx258/01.06-NumPy.html#1.6.2.8-Integrating-Everything-Together)", "section": "1.6.2.8 Integrating Everything Together" } }, "source": [ "Discussion Question: what would we need to change to access the matrix we created outside our function?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "< [1.5 List, Dictionaries, and Enumeration](https://ndcbe.github.io/cbe-xx258/01.05-Lists-Dictionaries-Enumerate.html) | [Contents](toc.html) | [1.7 Visualization with matplotlib](https://ndcbe.github.io/cbe-xx258/01.07-Matplotlib.html) >

\"Open

\"Download\"" ] } ], "metadata": { "colab": { "collapsed_sections": [ "xCRFBLk3qnWw", "0b7S8aRkqnXL", "hVTWyRgyqnXT", "9CTmfuN6qnXe", "kHsSx8OcqnXt", "hIS0pUx9qnX3", "Ck5L2vnuqnX-" ], "name": "L4-NumPy-Matplotlib.ipynb", "provenance": [], "version": "0.3.2" }, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.3" } }, "nbformat": 4, "nbformat_minor": 1 }