diff --git a/notebooks/020_numpy/001_numpy_views_and_copies.ipynb b/notebooks/020_numpy/001_numpy_views_and_copies.ipynb index 13ccfe6..b83ed1b 100644 --- a/notebooks/020_numpy/001_numpy_views_and_copies.ipynb +++ b/notebooks/020_numpy/001_numpy_views_and_copies.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "86b10564", "metadata": { "slideshow": { @@ -27,31 +27,32 @@ " print(txt)" ] }, - { - "cell_type": "markdown", - "id": "a5bbf650", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "# NumPy views and copies\n", - "\n", - "- Operations that only require changing the metadata always do so, and return a **view**\n", - "- Operations that cannot be executed by changing the metadata create a new memory block, and return a **copy**" - ] - }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "id": "53bd92f9", "metadata": { "slideshow": { "slide_type": "fragment" } }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 0 1 2 3]\n", + " [ 4 5 6 7]\n", + " [ 8 9 10 11]]\n", + "\n", + "dtype\tint64\n", + "ndim\t2\n", + "shape\t(3, 4)\n", + "strides\t(32, 8)\n", + " \n" + ] + } + ], "source": [ "x = np.arange(12).reshape(3, 4).copy()\n", "print_info(x)" @@ -83,14 +84,29 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "id": "f1b82845", "metadata": { "slideshow": { "slide_type": "fragment" } }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 1 3]\n", + " [ 9 11]]\n", + "\n", + "dtype\tint64\n", + "ndim\t2\n", + "shape\t(2, 2)\n", + "strides\t(64, 16)\n", + " \n" + ] + } + ], "source": [ "# slice\n", "y = x[0::2, 1::2]\n", @@ -111,14 +127,28 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "id": "28ea1c71", "metadata": { "slideshow": { "slide_type": "fragment" } }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 0 1 2 3 4 5 6 7 8 9 10 11]]\n", + "\n", + "dtype\tint64\n", + "ndim\t2\n", + "shape\t(1, 12)\n", + "strides\t(96, 8)\n", + " \n" + ] + } + ], "source": [ "z = x.reshape(1, 12)\n", "print_info(z)" @@ -146,29 +176,90 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, + "id": "4ff516cc", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 1 3]\n", + " [ 9 11]]\n" + ] + } + ], + "source": [ + "print(y) # a view of x" + ] + }, + { + "cell_type": "code", + "execution_count": 9, "id": "46822b5a", "metadata": { "slideshow": { "slide_type": "subslide" } }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[101 103]\n", + " [109 111]]\n", + "\n", + "dtype\tint64\n", + "ndim\t2\n", + "shape\t(2, 2)\n", + "strides\t(64, 16)\n", + " \n" + ] + } + ], "source": [ - "y += 100\n", + "y += 100 \n", "print_info(y)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "id": "ad9a7950", "metadata": { "slideshow": { "slide_type": "subslide" } }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 0 101 2 103]\n", + " [ 4 5 6 7]\n", + " [ 8 109 10 111]]\n", + "\n", + "dtype\tint64\n", + "ndim\t2\n", + "shape\t(3, 4)\n", + "strides\t(32, 8)\n", + " \n", + "[[ 0 101 2 103 4 5 6 7 8 109 10 111]]\n", + "\n", + "dtype\tint64\n", + "ndim\t2\n", + "shape\t(1, 12)\n", + "strides\t(96, 8)\n", + " \n" + ] + } + ], "source": [ "print_info(x)\n", "print_info(z)" @@ -183,14 +274,14 @@ } }, "source": [ - "Functions that take an array as an input should **avoid modifying it in place!***\n", + "Functions that take an array as an input should **avoid modifying it in place!**\n", "\n", "Always make a copy or be super extra clear in the docstring." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "id": "aa25ac4b", "metadata": { "slideshow": { @@ -199,8 +290,9 @@ }, "outputs": [], "source": [ - "def robust_log(x, cte=1e-10):\n", - " \"\"\" Returns the log of an array, deals with values that are 0.\n", + "def robust_log(x, cte = 3):\n", + " \"\"\" \n", + " Returns the log of an array, deals with values that are equal to 0.\n", "\n", " `x` is expected to have non-negative values.\n", " \"\"\"\n", @@ -212,7 +304,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "id": "471d9d6b", "metadata": { "slideshow": { @@ -221,53 +313,89 @@ }, "outputs": [], "source": [ - "a = np.array([[0.3, 0.01], [0, 1]])" + "a = np.array([[96, 0.01], [0, 1]])" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "id": "6c05d356", "metadata": { "slideshow": { "slide_type": "fragment" } }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0. 1.]\n", + "\n", + "dtype\tfloat64\n", + "ndim\t1\n", + "shape\t(2,)\n", + "strides\t(8,)\n", + " \n" + ] + } + ], "source": [ - "# This is a view of `a`\n", + "# a view of `a`\n", "b = a[1, :]\n", "print_info(b)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "id": "9d96fb61", "metadata": { "slideshow": { "slide_type": "fragment" } }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 4.56434819, -4.60517019],\n", + " [ 1.09861229, 0. ]])" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "# what is the output?\n", "robust_log(a)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "id": "35d0327d", "metadata": { "slideshow": { "slide_type": "fragment" } }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "array([3., 1.])" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "# what is the output?\n", - "b # what about b??" + "np.set_printoptions(suppress=True)\n", + "b" ] }, { @@ -284,7 +412,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "id": "c5359eac", "metadata": { "slideshow": { @@ -293,7 +421,7 @@ }, "outputs": [], "source": [ - "def robust_log(x, cte=1e-10):\n", + "def robust_log(x, cte = 3):\n", " \"\"\" Returns the log of an array, deals with values that are 0.\n", "\n", " `x` is expected to have non-negative values.\n", @@ -305,34 +433,63 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 18, "id": "0bf9b2d5", "metadata": { "slideshow": { "slide_type": "fragment" } }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0. 1.]\n" + ] + }, + { + "data": { + "text/plain": [ + "array([[ 4.56434819, -4.60517019],\n", + " [ 1.09861229, 0. ]])" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "a = np.array([[0.3, 0.01], [0, 1]])\n", + "a = np.array([[96, 0.01], [0, 1]])\n", "b = a[1, :]\n", - "\n", - "#robust_sqrt(a)" + "print(b)\n", + "robust_log(a)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "id": "895209ce", "metadata": { "slideshow": { "slide_type": "fragment" } }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "array([0., 1.])" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "a # what is the output? \n", - "# b" + "b" ] }, { @@ -347,8 +504,7 @@ "# Copies\n", "\n", "- Operations that cannot be executed by changing the metadata create a new memory block, and return a **copy**\n", - "\n", - "- How to find out view or copy?" + "- can be forced by method .copy()" ] }, { @@ -367,10 +523,26 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "id": "fbcf3100", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 0 1 2 3]\n", + " [ 4 5 6 7]\n", + " [ 8 9 10 11]]\n", + "\n", + "dtype\tint64\n", + "ndim\t2\n", + "shape\t(3, 4)\n", + "strides\t(32, 8)\n", + " \n" + ] + } + ], "source": [ "x = np.arange(12).reshape(3, 4).copy()\n", "print_info(x)" @@ -378,32 +550,69 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, "id": "6c50e46e", "metadata": { "slideshow": { "slide_type": "slide" } }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ 1 0 11]\n", + "\n", + "dtype\tint64\n", + "ndim\t1\n", + "shape\t(3,)\n", + "strides\t(8,)\n", + " \n" + ] + } + ], "source": [ "#print(x)\n", "z = x[[0, 0, 2], [1, 0, 3]]\n", - "# Can you guess what's z equal to?\n", + "# what's z equal to?\n", "\n", "print_info(z)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 22, "id": "9d65a5c3", "metadata": { "slideshow": { "slide_type": "slide" } }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1001 1000 1011]\n", + "\n", + "dtype\tint64\n", + "ndim\t1\n", + "shape\t(3,)\n", + "strides\t(8,)\n", + " \n", + "[[ 0 1 2 3]\n", + " [ 4 5 6 7]\n", + " [ 8 9 10 11]]\n", + "\n", + "dtype\tint64\n", + "ndim\t2\n", + "shape\t(3, 4)\n", + "strides\t(32, 8)\n", + " \n" + ] + } + ], "source": [ "z += 1000\n", "print_info(z)\n", @@ -444,7 +653,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.3" + "version": "3.9.12" } }, "nbformat": 4,