{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# CHAPTER 4" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## NumPy basics: Arrays and vectorized computations" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/usr/local/lib/python3.5/site-packages/matplotlib/font_manager.py:273: UserWarning: Matplotlib is building the font cache using fc-list. This may take a moment.\n", " warnings.warn('Matplotlib is building the font cache using fc-list. This may take a moment.')\n", "/usr/local/lib/python3.5/site-packages/matplotlib/font_manager.py:273: UserWarning: Matplotlib is building the font cache using fc-list. This may take a moment.\n", " warnings.warn('Matplotlib is building the font cache using fc-list. This may take a moment.')\n" ] } ], "source": [ "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from __future__ import division\n", "from numpy.random import randn\n", "import numpy as np\n", "np.set_printoptions(precision = 4, suppress = True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The NumPy ndarray: a multidimentional array object" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[-1.1288, 0.1897, 0.7566],\n", " [-0.4347, -0.5984, -0.6985]])" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data = randn(2, 3)\n", "data" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[-11.2878, 1.8974, 7.5657],\n", " [ -4.3468, -5.9838, -6.9849]])" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data * 10" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[-2.2576, 0.3795, 1.5131],\n", " [-0.8694, -1.1968, -1.397 ]])" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data + data" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(2, 3)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.shape" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "dtype('float64')" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.dtype" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Creating ndarrays" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 6. , 7.5, 8. , 0. , 1. ])" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data1 = [6, 7.5, 8, 0, 1]\n", "arr1 = np.array(data1)\n", "arr1" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[1, 2, 3, 4],\n", " [5, 6, 7, 8]])" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data2 = [[1, 2, 3, 4], [5, 6, 7, 8]]\n", "arr2 = np.array(data2)\n", "arr2" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "2" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr2.ndim" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(2, 4)" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr2.shape" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "dtype('float64')" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr1.dtype" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "dtype('int64')" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr2.dtype" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.zeros(10)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 0., 0., 0., 0., 0., 0.],\n", " [ 0., 0., 0., 0., 0., 0.],\n", " [ 0., 0., 0., 0., 0., 0.]])" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.zeros((3, 6))" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.ones(10)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 1., 1., 1.],\n", " [ 1., 1., 1.]])" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.ones((2, 3))" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[[ 3.1050e+231, 1.7306e-077],\n", " [ 2.9644e-323, 0.0000e+000],\n", " [ 0.0000e+000, 0.0000e+000]],\n", "\n", " [[ 0.0000e+000, 0.0000e+000],\n", " [ 0.0000e+000, 0.0000e+000],\n", " [ 0.0000e+000, 8.3440e-309]]])" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.empty((2, 3, 2))" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.arange(15)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Data type for ndarrays" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [], "source": [ "arr3 = np.array([1, 2, 3], dtype = np.float64)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "dtype('float64')" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr3.dtype" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false }, "outputs": [], "source": [ "arr4 = np.array([1, 2, 3], dtype = np.int64)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "dtype('int64')" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr4.dtype" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "dtype('int64')" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr5 = np.array([1, 2, 3, 4, 5])\n", "arr5.dtype" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "dtype('float64')" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr_float = arr5.astype(np.float64)\n", "arr_float.dtype" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "dtype('float64')" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr6 = np.array([3.7, -1.2, -2.6, 0.5, 12.9, 10.1])\n", "arr6.dtype" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 3, -1, -2, 0, 12, 10], dtype=int32)" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr6.astype(np.int32)" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 1.25, -9.6 , 42. ])" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "numeric_strings = np.array(['1.25', '-9.6', '42'], dtype = np.string_)\n", "numeric_strings.astype(float)" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "int_array = np.arange(10)\n", "calibers = np.array([0.22, 0.270, .357, .380, .44, .50], dtype = np.float64)\n", "int_array.astype(calibers.dtype)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 0, 1879048192, 3537412978, 805308408, 6,\n", " 0, 0, 393216], dtype=uint32)" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "empty_unit32 = np.empty(8, dtype = 'u4')\n", "empty_unit32" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Operations between arrays and scalas" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[1, 2, 3],\n", " [4, 5, 6]])" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr7 = np.array([[1, 2, 3], [4, 5, 6]])\n", "arr7" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 2, 4, 6],\n", " [ 8, 10, 12]])" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr7 + arr7" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 1, 4, 9],\n", " [16, 25, 36]])" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr7 * arr7" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 1. , 0.5 , 0.3333],\n", " [ 0.25 , 0.2 , 0.1667]])" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "1/arr7" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 1. , 1.4142, 1.7321],\n", " [ 2. , 2.2361, 2.4495]])" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr7**0.5" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Basic indexing and slicing" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr8 = np.arange(10)\n", "arr8" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "5" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr8[5]" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([5, 6, 7])" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr8[5:8]" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 0, 1, 2, 3, 4, 12, 12, 12, 8, 9])" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr8[5:8] = 12\n", "arr8" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([12, 12, 12])" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "array_slice = arr8[5:8]\n", "array_slice" ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 12, 12345, 12])" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "array_slice[1] = 12345\n", "array_slice" ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([64, 64, 64])" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "array_slice[:] = 64\n", "array_slice" ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([7, 8, 9])" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])\n", "arr2d[2]" ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "3" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr2d[0][2]" ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "3" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr2d[0, 2]" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[[ 1, 2, 3],\n", " [ 4, 5, 6]],\n", "\n", " [[ 7, 8, 9],\n", " [10, 11, 12]]])" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr3d = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])\n", "arr3d" ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[1, 2, 3],\n", " [4, 5, 6]])" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr3d[0]" ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([4, 5, 6])" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr3d[0, 1]" ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([4, 5, 6])" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr3d[0][1]" ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "6" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr3d[0][1][2]" ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "collapsed": false }, "outputs": [], "source": [ "old_values = arr3d[0].copy()" ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[[42, 42, 42],\n", " [42, 42, 42]],\n", "\n", " [[ 7, 8, 9],\n", " [10, 11, 12]]])" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr3d[0] = 42\n", "arr3d" ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[[ 1, 2, 3],\n", " [ 4, 5, 6]],\n", "\n", " [[ 7, 8, 9],\n", " [10, 11, 12]]])" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr3d[0] = old_values\n", "arr3d" ] }, { "cell_type": "code", "execution_count": 55, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([7, 8, 9])" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr3d[1, 0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Indexing with slicing" ] }, { "cell_type": "code", "execution_count": 56, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 0, 1, 2, 3, 4, 64, 64, 64, 8, 9])" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr8" ] }, { "cell_type": "code", "execution_count": 57, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 1, 2, 3, 4, 64])" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr8[1:6]" ] }, { "cell_type": "code", "execution_count": 58, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[1, 2, 3],\n", " [4, 5, 6],\n", " [7, 8, 9]])" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr2d" ] }, { "cell_type": "code", "execution_count": 59, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[1, 2, 3],\n", " [4, 5, 6]])" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr2d[:2]" ] }, { "cell_type": "code", "execution_count": 60, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[2, 3],\n", " [5, 6]])" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr2d[:2, 1:]" ] }, { "cell_type": "code", "execution_count": 61, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([4, 5])" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr2d[1, :2]" ] }, { "cell_type": "code", "execution_count": 62, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([7])" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr2d[2, :1]" ] }, { "cell_type": "code", "execution_count": 63, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[1],\n", " [4],\n", " [7]])" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr2d[:, :1]" ] }, { "cell_type": "code", "execution_count": 64, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[1, 0, 0],\n", " [4, 0, 0],\n", " [7, 8, 9]])" ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr2d[:2, 1:] = 0\n", "arr2d" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Boolean indexing" ] }, { "cell_type": "code", "execution_count": 65, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'], \n", " dtype='" ] }, "execution_count": 113, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.imshow(z, cmap = plt.cm.gray)\n", "plt.colorbar()\n", "plt.title('Image plot of $\\sqrt{x^2 + y^2}$ for a grid of values')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Expressing conditional logic as array operations" ] }, { "cell_type": "code", "execution_count": 114, "metadata": { "collapsed": false }, "outputs": [], "source": [ "xarr = np.array([1.1, 1.2, 1.3, 1.4, 1.5])\n", "yarr = np.array([2.1, 2.2, 2.3, 2.4, 2.5])\n", "cond = np.array([True, False, True, True, False])" ] }, { "cell_type": "code", "execution_count": 115, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[1.1000000000000001, 2.2000000000000002, 1.3, 1.3999999999999999, 2.5]" ] }, "execution_count": 115, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result = [(x if c else y) \n", " for x, y, c in zip(xarr, yarr, cond)]\n", "result" ] }, { "cell_type": "code", "execution_count": 116, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 1.1, 2.2, 1.3, 1.4, 2.5])" ] }, "execution_count": 116, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result = np.where(cond, xarr, yarr)\n", "result" ] }, { "cell_type": "code", "execution_count": 117, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 0.6851, -0.6378, -0.8524, 1.3891],\n", " [ 0.1806, 1.2007, 0.5101, -0.2702],\n", " [-0.717 , 0.783 , 0.1876, 0.8501],\n", " [ 0.0737, -0.3917, 0.6096, 1.2823]])" ] }, "execution_count": 117, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr16 = randn(4, 4)\n", "arr16" ] }, { "cell_type": "code", "execution_count": 118, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 2, -2, -2, 2],\n", " [ 2, 2, 2, -2],\n", " [-2, 2, 2, 2],\n", " [ 2, -2, 2, 2]])" ] }, "execution_count": 118, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.where(arr16 > 0, 2, -2)" ] }, { "cell_type": "code", "execution_count": 119, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 2. , -0.6378, -0.8524, 2. ],\n", " [ 2. , 2. , 2. , -0.2702],\n", " [-0.717 , 2. , 2. , 2. ],\n", " [ 2. , -0.3917, 2. , 2. ]])" ] }, "execution_count": 119, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.where(arr16 > 0, 2, arr16)" ] }, { "cell_type": "raw", "metadata": { "collapsed": false }, "source": [ "# Not to be executed\n", "result = []\n", "for i in range(n):\n", " if cond1[i] and cond2[i]:\n", " result.append(0)\n", " elif cond1[i]:\n", " result.append(1)\n", " elif cond2[i]:\n", " result.append(2)\n", " else:\n", " result.append(3)" ] }, { "cell_type": "raw", "metadata": { "collapsed": false }, "source": [ "# Not to be executed\n", "\n", "np.where(cond1 & cond2, 0, \n", " np.where(cond1, 1, \n", " np.where(cond2, 2, 3)))" ] }, { "cell_type": "raw", "metadata": { "collapsed": false }, "source": [ "# Not to be executed\n", "\n", "result = 1 * cond1 + 2 * cond2 + 3 * -(cond1 | cond2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Mathematical and statistical methods" ] }, { "cell_type": "code", "execution_count": 120, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 1.6533, 0.1569, 1.1953, 0.5076, -0.6969],\n", " [ 0.3001, 1.3571, 0.7924, 0.5225, 0.777 ],\n", " [ 0.326 , -0.4121, -0.4198, -0.44 , 1.7303],\n", " [ 1.4647, 0.1069, 0.0008, -0.1721, 0.0581]])" ] }, "execution_count": 120, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr17 = np.random.randn(4, 5)\n", "arr17" ] }, { "cell_type": "code", "execution_count": 121, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0.44040416796585308" ] }, "execution_count": 121, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr17.mean()" ] }, { "cell_type": "code", "execution_count": 122, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0.44040416796585308" ] }, "execution_count": 122, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.mean(arr17)" ] }, { "cell_type": "code", "execution_count": 123, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "8.8080833593170613" ] }, "execution_count": 123, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr17.sum()" ] }, { "cell_type": "code", "execution_count": 124, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 0.5632, 0.7498, 0.1569, 0.2917])" ] }, "execution_count": 124, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr17.mean(axis = 1) # row" ] }, { "cell_type": "code", "execution_count": 125, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 0.9361, 0.3022, 0.3922, 0.1045, 0.4671])" ] }, "execution_count": 125, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr17.mean(axis = 0) # column" ] }, { "cell_type": "code", "execution_count": 126, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[1, 2, 3],\n", " [4, 5, 6],\n", " [7, 8, 9]])" ] }, "execution_count": 126, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr18 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])\n", "arr18" ] }, { "cell_type": "code", "execution_count": 127, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 1, 2, 3],\n", " [ 5, 7, 9],\n", " [12, 15, 18]])" ] }, "execution_count": 127, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr18.cumsum(0) # sum of column " ] }, { "cell_type": "code", "execution_count": 128, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 1, 2, 6],\n", " [ 4, 20, 120],\n", " [ 7, 56, 504]])" ] }, "execution_count": 128, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr18.cumprod(1) # prod of row" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Methods for boolean arrays" ] }, { "cell_type": "code", "execution_count": 129, "metadata": { "collapsed": false }, "outputs": [], "source": [ "arr19 = randn(100)" ] }, { "cell_type": "code", "execution_count": 130, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "50" ] }, "execution_count": 130, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(arr19 > 0).sum()" ] }, { "cell_type": "code", "execution_count": 131, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 131, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bools = np.array([False, False, True, False])\n", "bools.any()" ] }, { "cell_type": "code", "execution_count": 132, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 132, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bools.all()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### sorting" ] }, { "cell_type": "code", "execution_count": 133, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([-0.5483, 1.4955, 0.5092, -0.8928, -1.7595, 1.3327, 0.4815,\n", " -1.1086])" ] }, "execution_count": 133, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr20 = randn(8)\n", "arr20" ] }, { "cell_type": "code", "execution_count": 134, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([-1.7595, -1.1086, -0.8928, -0.5483, 0.4815, 0.5092, 1.3327,\n", " 1.4955])" ] }, "execution_count": 134, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr20.sort()\n", "\n", "arr20" ] }, { "cell_type": "code", "execution_count": 135, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 0.1766, -2.2486, 1.2854],\n", " [ 0.3819, 0.1207, 0.5651],\n", " [ 0.9679, 0.9795, 0.8815],\n", " [ 0.2147, -1.4361, 0.7716],\n", " [-0.2916, 0.5463, -0.827 ]])" ] }, "execution_count": 135, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr21 = randn(5, 3)\n", "arr21" ] }, { "cell_type": "code", "execution_count": 136, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[-2.2486, 0.1766, 1.2854],\n", " [ 0.1207, 0.3819, 0.5651],\n", " [ 0.8815, 0.9679, 0.9795],\n", " [-1.4361, 0.2147, 0.7716],\n", " [-0.827 , -0.2916, 0.5463]])" ] }, "execution_count": 136, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr21.sort(1)\n", "arr21" ] }, { "cell_type": "code", "execution_count": 137, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "-1.6186837940856837" ] }, "execution_count": 137, "metadata": {}, "output_type": "execute_result" } ], "source": [ "large_array = randn(1000)\n", "large_array.sort()\n", "large_array[int(0.05 * len(large_array))]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Unique and Other Set Logic" ] }, { "cell_type": "code", "execution_count": 138, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array(['Bob', 'Joe', 'Will'], \n", " dtype=' 0, 1, -1)\n", "walk = steps.cumsum()" ] }, { "cell_type": "code", "execution_count": 171, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "-25" ] }, "execution_count": 171, "metadata": {}, "output_type": "execute_result" } ], "source": [ "walk.min()" ] }, { "cell_type": "code", "execution_count": 172, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "13" ] }, "execution_count": 172, "metadata": {}, "output_type": "execute_result" } ], "source": [ "walk.max()" ] }, { "cell_type": "code", "execution_count": 173, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "27" ] }, "execution_count": 173, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(np.abs(walk) >= 10).argmax()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Simulating many random walks at once" ] }, { "cell_type": "code", "execution_count": 174, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ -1, -2, -1, ..., 38, 39, 38],\n", " [ -1, -2, -1, ..., 50, 51, 50],\n", " [ -1, 0, -1, ..., -8, -7, -8],\n", " ..., \n", " [ -1, -2, -3, ..., -100, -99, -98],\n", " [ -1, 0, -1, ..., -16, -17, -16],\n", " [ 1, 0, -1, ..., -10, -11, -12]])" ] }, "execution_count": 174, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nwalks = 5000\n", "nsteps = 1000\n", "draws = np.random.randint(0, 2, size = (nwalks, nsteps))\n", "steps = np.where(draws > 0, 1, -1)\n", "walks = steps.cumsum(1)\n", "walks" ] }, { "cell_type": "code", "execution_count": 175, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "119" ] }, "execution_count": 175, "metadata": {}, "output_type": "execute_result" } ], "source": [ "walks.max()" ] }, { "cell_type": "code", "execution_count": 176, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "-118" ] }, "execution_count": 176, "metadata": {}, "output_type": "execute_result" } ], "source": [ "walks.min()" ] }, { "cell_type": "code", "execution_count": 177, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ True, True, False, ..., True, False, False], dtype=bool)" ] }, "execution_count": 177, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hits30 = (np.abs(walks) >= 30).any(1)\n", "hits30" ] }, { "cell_type": "code", "execution_count": 178, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "3407" ] }, "execution_count": 178, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hits30.sum()" ] }, { "cell_type": "code", "execution_count": 179, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "503.94511300264162" ] }, "execution_count": 179, "metadata": {}, "output_type": "execute_result" } ], "source": [ "crossing_times = (np.abs(walks[hits30]) >= 30).argmax(1)\n", "crossing_times.mean()" ] }, { "cell_type": "code", "execution_count": 180, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 0.0576, 0.4903, -0.0204, ..., 0.036 , 0.016 , 0.5973],\n", " [-0.2707, -0.0213, 0.0457, ..., 0.0279, -0.3356, 0.2751],\n", " [ 0.4423, -0.17 , 0.3218, ..., -0.1858, -0.2958, 0.0574],\n", " ..., \n", " [-0.4958, 0.2782, 0.0975, ..., 0.2677, 0.1195, 0.1042],\n", " [-0.1086, 0.2598, -0.0773, ..., 0.0493, 0.217 , -0.2588],\n", " [ 0.0867, 0.1986, 0.2159, ..., 0.2175, -0.1233, 0.028 ]])" ] }, "execution_count": 180, "metadata": {}, "output_type": "execute_result" } ], "source": [ "steps = np.random.normal(loc=0, scale=0.25,\n", " size=(nwalks, nsteps))\n", "steps" ] } ], "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.5.1" } }, "nbformat": 4, "nbformat_minor": 0 }