{ "metadata": { "name": "", "signature": "sha256:54d9c596e5e97b6d01c12820f5f4f121ba0a2bf7b62b73786ead0e5b57822472" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "The NumPy ndarray" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import numpy as np" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "code", "collapsed": false, "input": [ "data = np.array([[0.9,-0.2,-0.8],[0.5,0.2,0.9]])" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 5 }, { "cell_type": "code", "collapsed": false, "input": [ "data" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 6, "text": [ "array([[ 0.9, -0.2, -0.8],\n", " [ 0.5, 0.2, 0.9]])" ] } ], "prompt_number": 6 }, { "cell_type": "code", "collapsed": false, "input": [ "data*10" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 7, "text": [ "array([[ 9., -2., -8.],\n", " [ 5., 2., 9.]])" ] } ], "prompt_number": 7 }, { "cell_type": "code", "collapsed": false, "input": [ "data+data" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 8, "text": [ "array([[ 1.8, -0.4, -1.6],\n", " [ 1. , 0.4, 1.8]])" ] } ], "prompt_number": 8 }, { "cell_type": "code", "collapsed": false, "input": [ "data.shape" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 9, "text": [ "(2, 3)" ] } ], "prompt_number": 9 }, { "cell_type": "code", "collapsed": false, "input": [ "data.dtype" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 10, "text": [ "dtype('float64')" ] } ], "prompt_number": 10 }, { "cell_type": "code", "collapsed": false, "input": [ "data1 = [6,7.5,8,0,1]" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 11 }, { "cell_type": "code", "collapsed": false, "input": [ "arr1 = np.array(data1)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 12 }, { "cell_type": "code", "collapsed": false, "input": [ "arr1" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 13, "text": [ "array([ 6. , 7.5, 8. , 0. , 1. ])" ] } ], "prompt_number": 13 }, { "cell_type": "code", "collapsed": false, "input": [ "data2 = [[1,2,3,4],[5,6,7,8]]" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 14 }, { "cell_type": "code", "collapsed": false, "input": [ "arr2 = np.array(data2)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 15 }, { "cell_type": "code", "collapsed": false, "input": [ "arr2" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 16, "text": [ "array([[1, 2, 3, 4],\n", " [5, 6, 7, 8]])" ] } ], "prompt_number": 16 }, { "cell_type": "code", "collapsed": false, "input": [ "arr2.ndim" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 17, "text": [ "2" ] } ], "prompt_number": 17 }, { "cell_type": "code", "collapsed": false, "input": [ "arr2.shape" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 18, "text": [ "(2, 4)" ] } ], "prompt_number": 18 }, { "cell_type": "code", "collapsed": false, "input": [ "arr1.dtype" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 19, "text": [ "dtype('float64')" ] } ], "prompt_number": 19 }, { "cell_type": "code", "collapsed": false, "input": [ "arr2.dtype" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 20, "text": [ "dtype('int64')" ] } ], "prompt_number": 20 }, { "cell_type": "code", "collapsed": false, "input": [ "np.zeros(10)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 21, "text": [ "array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])" ] } ], "prompt_number": 21 }, { "cell_type": "code", "collapsed": false, "input": [ "np.zeros((3,6))" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 22, "text": [ "array([[ 0., 0., 0., 0., 0., 0.],\n", " [ 0., 0., 0., 0., 0., 0.],\n", " [ 0., 0., 0., 0., 0., 0.]])" ] } ], "prompt_number": 22 }, { "cell_type": "code", "collapsed": false, "input": [ "np.empty((2,3,2))" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 23, "text": [ "array([[[ 0.00000000e+000, 1.28822983e-231],\n", " [ 2.16366771e-314, 2.16371523e-314],\n", " [ 2.16372047e-314, 2.16371173e-314]],\n", "\n", " [[ 2.14550304e-314, 0.00000000e+000],\n", " [ 2.15072965e-314, 2.14796467e-314],\n", " [ 0.00000000e+000, 1.28822983e-231]]])" ] } ], "prompt_number": 23 }, { "cell_type": "code", "collapsed": false, "input": [ "np.arange(15)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 24, "text": [ "array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])" ] } ], "prompt_number": 24 }, { "cell_type": "code", "collapsed": false, "input": [ "arr1 = np.array([1,2,3], dtype=np.float64)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 25 }, { "cell_type": "code", "collapsed": false, "input": [ "arr2 = np.array([1,2,3], dtype=np.int32)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 26 }, { "cell_type": "code", "collapsed": false, "input": [ "arr1.dtype" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 27, "text": [ "dtype('float64')" ] } ], "prompt_number": 27 }, { "cell_type": "code", "collapsed": false, "input": [ "arr2.dtype" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 28, "text": [ "dtype('int32')" ] } ], "prompt_number": 28 }, { "cell_type": "code", "collapsed": false, "input": [ "arr=np.array([1,2,3,4,5])" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 29 }, { "cell_type": "code", "collapsed": false, "input": [ "arr.dtype" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 30, "text": [ "dtype('int64')" ] } ], "prompt_number": 30 }, { "cell_type": "code", "collapsed": false, "input": [ "float_arr = arr.astype(np.float64)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 31 }, { "cell_type": "code", "collapsed": false, "input": [ "float_arr.dtype" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 32, "text": [ "dtype('float64')" ] } ], "prompt_number": 32 }, { "cell_type": "code", "collapsed": false, "input": [ "numeric_strings = np.array(['1.25','-9.6','42'], dtype = np.string_)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 34 }, { "cell_type": "code", "collapsed": false, "input": [ "numeric_strings.astype(float)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 35, "text": [ "array([ 1.25, -9.6 , 42. ])" ] } ], "prompt_number": 35 }, { "cell_type": "code", "collapsed": false, "input": [ "int_array = np.arange(10)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 36 }, { "cell_type": "code", "collapsed": false, "input": [ "caliber = np.array([.22,.270,.357, .380, .44,.50],dtype=np.float64)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 37 }, { "cell_type": "code", "collapsed": false, "input": [ "int_array.astype(caliber.dtype)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 40, "text": [ "array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])" ] } ], "prompt_number": 40 }, { "cell_type": "code", "collapsed": false, "input": [ "empty_uint32 = np.empty(8, dtype='u4')" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 41 }, { "cell_type": "code", "collapsed": false, "input": [ "empty_uint32" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 42, "text": [ "array([ 0, 1075314688, 0, 1075707904, 0,\n", " 1075838976, 0, 1072693248], dtype=uint32)" ] } ], "prompt_number": 42 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Operations between Arrays and Scalars" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Arrays are important because they enable you to express batch operations on data without writing any for loops. This is usually called vectorization." ] }, { "cell_type": "code", "collapsed": false, "input": [ "arr = np.array([[1.,2.,3.],[4.,5.,6.]])" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 44 }, { "cell_type": "code", "collapsed": false, "input": [ "arr" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 45, "text": [ "array([[ 1., 2., 3.],\n", " [ 4., 5., 6.]])" ] } ], "prompt_number": 45 }, { "cell_type": "code", "collapsed": false, "input": [ "arr*arr" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 46, "text": [ "array([[ 1., 4., 9.],\n", " [ 16., 25., 36.]])" ] } ], "prompt_number": 46 }, { "cell_type": "code", "collapsed": false, "input": [ "arr-arr" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 47, "text": [ "array([[ 0., 0., 0.],\n", " [ 0., 0., 0.]])" ] } ], "prompt_number": 47 }, { "cell_type": "code", "collapsed": false, "input": [ "1/arr" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 48, "text": [ "array([[ 1. , 0.5 , 0.33333333],\n", " [ 0.25 , 0.2 , 0.16666667]])" ] } ], "prompt_number": 48 }, { "cell_type": "code", "collapsed": false, "input": [ "arr**0.5" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 49, "text": [ "array([[ 1. , 1.41421356, 1.73205081],\n", " [ 2. , 2.23606798, 2.44948974]])" ] } ], "prompt_number": 49 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Basic Indexing and Slicing" ] }, { "cell_type": "code", "collapsed": false, "input": [ "arr = np.arange(10)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 50 }, { "cell_type": "code", "collapsed": false, "input": [ "arr" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 51, "text": [ "array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])" ] } ], "prompt_number": 51 }, { "cell_type": "code", "collapsed": false, "input": [ "arr[5]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 52, "text": [ "5" ] } ], "prompt_number": 52 }, { "cell_type": "code", "collapsed": false, "input": [ "arr[5:8]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 53, "text": [ "array([5, 6, 7])" ] } ], "prompt_number": 53 }, { "cell_type": "code", "collapsed": false, "input": [ "arr[5:8]=12" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 54 }, { "cell_type": "code", "collapsed": false, "input": [ "arr" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 55, "text": [ "array([ 0, 1, 2, 3, 4, 12, 12, 12, 8, 9])" ] } ], "prompt_number": 55 }, { "cell_type": "code", "collapsed": false, "input": [ "arr_slice = arr[5:8]" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 56 }, { "cell_type": "code", "collapsed": false, "input": [ "arr_slice[1]=12345" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 57 }, { "cell_type": "code", "collapsed": false, "input": [ "arr" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 58, "text": [ "array([ 0, 1, 2, 3, 4, 12, 12345, 12, 8, 9])" ] } ], "prompt_number": 58 }, { "cell_type": "code", "collapsed": false, "input": [ "arr_slice[:]=64" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 59 }, { "cell_type": "code", "collapsed": false, "input": [ "arr" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 60, "text": [ "array([ 0, 1, 2, 3, 4, 64, 64, 64, 8, 9])" ] } ], "prompt_number": 60 }, { "cell_type": "code", "collapsed": false, "input": [ "arr[1:6]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 61, "text": [ "array([ 1, 2, 3, 4, 64])" ] } ], "prompt_number": 61 }, { "cell_type": "code", "collapsed": false, "input": [ "arr2d = np.array([[1,2,3],[4,5,6],[7,8,9]])" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 62 }, { "cell_type": "code", "collapsed": false, "input": [ "arr2d" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 63, "text": [ "array([[1, 2, 3],\n", " [4, 5, 6],\n", " [7, 8, 9]])" ] } ], "prompt_number": 63 }, { "cell_type": "code", "collapsed": false, "input": [ "arr2d[:2]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 64, "text": [ "array([[1, 2, 3],\n", " [4, 5, 6]])" ] } ], "prompt_number": 64 }, { "cell_type": "code", "collapsed": false, "input": [ "arr2d[:2,1:]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 65, "text": [ "array([[2, 3],\n", " [5, 6]])" ] } ], "prompt_number": 65 }, { "cell_type": "code", "collapsed": false, "input": [ "arr2d[:,:1]=0" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 66 }, { "cell_type": "code", "collapsed": false, "input": [ "arr2d" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 67, "text": [ "array([[0, 2, 3],\n", " [0, 5, 6],\n", " [0, 8, 9]])" ] } ], "prompt_number": 67 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Boolean Indexing" ] }, { "cell_type": "code", "collapsed": false, "input": [ "names = np.array(['Bob','Joe','Will', 'Bob','Will','Joe','Joe'])" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 68 }, { "cell_type": "code", "collapsed": false, "input": [ "data = np.random.randn(7,4)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 70 }, { "cell_type": "code", "collapsed": false, "input": [ "names" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 71, "text": [ "array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'], \n", " dtype='|S4')" ] } ], "prompt_number": 71 }, { "cell_type": "code", "collapsed": false, "input": [ "data" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 72, "text": [ "array([[ 0.80157062, -1.11126999, -0.36717661, -0.10146253],\n", " [ 0.27996882, 0.1007806 , -1.57268242, 0.53328684],\n", " [-1.72991998, -1.68063347, -0.56110756, -0.98492423],\n", " [ 0.62189742, 1.16186301, 0.97171423, 0.25522433],\n", " [-0.7793186 , 0.94409302, -0.82486789, -0.3777059 ],\n", " [-0.12322917, -0.71568842, 1.47153722, 1.73777872],\n", " [-0.45996373, -1.41262271, 1.26718241, -0.22801257]])" ] } ], "prompt_number": 72 }, { "cell_type": "code", "collapsed": false, "input": [ "names == 'Bob'" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 73, "text": [ "array([ True, False, False, True, False, False, False], dtype=bool)" ] } ], "prompt_number": 73 }, { "cell_type": "code", "collapsed": false, "input": [ "data[names=='Bob']" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 74, "text": [ "array([[ 0.80157062, -1.11126999, -0.36717661, -0.10146253],\n", " [ 0.62189742, 1.16186301, 0.97171423, 0.25522433]])" ] } ], "prompt_number": 74 }, { "cell_type": "code", "collapsed": false, "input": [ "data[names=='Bob', 2:]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 75, "text": [ "array([[-0.36717661, -0.10146253],\n", " [ 0.97171423, 0.25522433]])" ] } ], "prompt_number": 75 }, { "cell_type": "code", "collapsed": false, "input": [ "names != 'Bob'" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 76, "text": [ "array([False, True, True, False, True, True, True], dtype=bool)" ] } ], "prompt_number": 76 }, { "cell_type": "code", "collapsed": false, "input": [ "data[-(names=='Bob')]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 77, "text": [ "array([[ 0.27996882, 0.1007806 , -1.57268242, 0.53328684],\n", " [-1.72991998, -1.68063347, -0.56110756, -0.98492423],\n", " [-0.7793186 , 0.94409302, -0.82486789, -0.3777059 ],\n", " [-0.12322917, -0.71568842, 1.47153722, 1.73777872],\n", " [-0.45996373, -1.41262271, 1.26718241, -0.22801257]])" ] } ], "prompt_number": 77 }, { "cell_type": "code", "collapsed": false, "input": [ "mask = (names == 'Bob') | (names == 'Will')" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 78 }, { "cell_type": "code", "collapsed": false, "input": [ "mask" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 79, "text": [ "array([ True, False, True, True, True, False, False], dtype=bool)" ] } ], "prompt_number": 79 }, { "cell_type": "code", "collapsed": false, "input": [ "data[mask]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 80, "text": [ "array([[ 0.80157062, -1.11126999, -0.36717661, -0.10146253],\n", " [-1.72991998, -1.68063347, -0.56110756, -0.98492423],\n", " [ 0.62189742, 1.16186301, 0.97171423, 0.25522433],\n", " [-0.7793186 , 0.94409302, -0.82486789, -0.3777059 ]])" ] } ], "prompt_number": 80 }, { "cell_type": "code", "collapsed": false, "input": [ "data[data<0]=0" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 81 }, { "cell_type": "code", "collapsed": false, "input": [ "data" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 82, "text": [ "array([[ 0.80157062, 0. , 0. , 0. ],\n", " [ 0.27996882, 0.1007806 , 0. , 0.53328684],\n", " [ 0. , 0. , 0. , 0. ],\n", " [ 0.62189742, 1.16186301, 0.97171423, 0.25522433],\n", " [ 0. , 0.94409302, 0. , 0. ],\n", " [ 0. , 0. , 1.47153722, 1.73777872],\n", " [ 0. , 0. , 1.26718241, 0. ]])" ] } ], "prompt_number": 82 }, { "cell_type": "code", "collapsed": false, "input": [ "data[names != 'Joe'] = 7" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 83 }, { "cell_type": "code", "collapsed": false, "input": [ "data" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 84, "text": [ "array([[ 7. , 7. , 7. , 7. ],\n", " [ 0.27996882, 0.1007806 , 0. , 0.53328684],\n", " [ 7. , 7. , 7. , 7. ],\n", " [ 7. , 7. , 7. , 7. ],\n", " [ 7. , 7. , 7. , 7. ],\n", " [ 0. , 0. , 1.47153722, 1.73777872],\n", " [ 0. , 0. , 1.26718241, 0. ]])" ] } ], "prompt_number": 84 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Fancy Indexing" ] }, { "cell_type": "code", "collapsed": false, "input": [ "arr = np.empty((8,4))" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 85 }, { "cell_type": "code", "collapsed": false, "input": [ "for i in range(8):\n", " arr[i]=i" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 86 }, { "cell_type": "code", "collapsed": false, "input": [ "arr" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 87, "text": [ "array([[ 0., 0., 0., 0.],\n", " [ 1., 1., 1., 1.],\n", " [ 2., 2., 2., 2.],\n", " [ 3., 3., 3., 3.],\n", " [ 4., 4., 4., 4.],\n", " [ 5., 5., 5., 5.],\n", " [ 6., 6., 6., 6.],\n", " [ 7., 7., 7., 7.]])" ] } ], "prompt_number": 87 }, { "cell_type": "code", "collapsed": false, "input": [ "arr[[4,3,0,6]]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 88, "text": [ "array([[ 4., 4., 4., 4.],\n", " [ 3., 3., 3., 3.],\n", " [ 0., 0., 0., 0.],\n", " [ 6., 6., 6., 6.]])" ] } ], "prompt_number": 88 }, { "cell_type": "code", "collapsed": false, "input": [ "arr[[-3,-5,-7]]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 89, "text": [ "array([[ 5., 5., 5., 5.],\n", " [ 3., 3., 3., 3.],\n", " [ 1., 1., 1., 1.]])" ] } ], "prompt_number": 89 }, { "cell_type": "code", "collapsed": false, "input": [ "arr = np.arange(32).reshape((8,4))" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 90 }, { "cell_type": "code", "collapsed": false, "input": [ "arr" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 91, "text": [ "array([[ 0, 1, 2, 3],\n", " [ 4, 5, 6, 7],\n", " [ 8, 9, 10, 11],\n", " [12, 13, 14, 15],\n", " [16, 17, 18, 19],\n", " [20, 21, 22, 23],\n", " [24, 25, 26, 27],\n", " [28, 29, 30, 31]])" ] } ], "prompt_number": 91 }, { "cell_type": "code", "collapsed": false, "input": [ "arr[[1,5,7,2],[0,3,1,2]]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 92, "text": [ "array([ 4, 23, 29, 10])" ] } ], "prompt_number": 92 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Transposing Arrays and Swapping Axes" ] }, { "cell_type": "code", "collapsed": false, "input": [ "arr = np.arange(15).reshape((3,5))" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 93 }, { "cell_type": "code", "collapsed": false, "input": [ "arr" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 94, "text": [ "array([[ 0, 1, 2, 3, 4],\n", " [ 5, 6, 7, 8, 9],\n", " [10, 11, 12, 13, 14]])" ] } ], "prompt_number": 94 }, { "cell_type": "code", "collapsed": false, "input": [ "arr.T" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 95, "text": [ "array([[ 0, 5, 10],\n", " [ 1, 6, 11],\n", " [ 2, 7, 12],\n", " [ 3, 8, 13],\n", " [ 4, 9, 14]])" ] } ], "prompt_number": 95 }, { "cell_type": "code", "collapsed": false, "input": [ "arr = np.random.randn(6,3)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 96 }, { "cell_type": "code", "collapsed": false, "input": [ "np.dot(arr.T,arr)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 97, "text": [ "array([[ 3.43085137, 1.45241985, -0.28497343],\n", " [ 1.45241985, 7.43054637, -2.33795759],\n", " [-0.28497343, -2.33795759, 6.11364269]])" ] } ], "prompt_number": 97 }, { "cell_type": "code", "collapsed": false, "input": [ "arr = np.arange(16).reshape((2,2,4))" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 98 }, { "cell_type": "code", "collapsed": false, "input": [ "arr" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 99, "text": [ "array([[[ 0, 1, 2, 3],\n", " [ 4, 5, 6, 7]],\n", "\n", " [[ 8, 9, 10, 11],\n", " [12, 13, 14, 15]]])" ] } ], "prompt_number": 99 }, { "cell_type": "code", "collapsed": false, "input": [ "arr.transpose((1,0,2))" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 100, "text": [ "array([[[ 0, 1, 2, 3],\n", " [ 8, 9, 10, 11]],\n", "\n", " [[ 4, 5, 6, 7],\n", " [12, 13, 14, 15]]])" ] } ], "prompt_number": 100 }, { "cell_type": "code", "collapsed": false, "input": [ "arr.swapaxes(1,2)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 101, "text": [ "array([[[ 0, 4],\n", " [ 1, 5],\n", " [ 2, 6],\n", " [ 3, 7]],\n", "\n", " [[ 8, 12],\n", " [ 9, 13],\n", " [10, 14],\n", " [11, 15]]])" ] } ], "prompt_number": 101 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Universal Functions: Fast Element-wise Array Functions" ] }, { "cell_type": "code", "collapsed": false, "input": [ "arr = np.arange(10)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 102 }, { "cell_type": "code", "collapsed": false, "input": [ "np.sqrt(arr)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 103, "text": [ "array([ 0. , 1. , 1.41421356, 1.73205081, 2. ,\n", " 2.23606798, 2.44948974, 2.64575131, 2.82842712, 3. ])" ] } ], "prompt_number": 103 }, { "cell_type": "code", "collapsed": false, "input": [ "np.exp(arr)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 104, "text": [ "array([ 1.00000000e+00, 2.71828183e+00, 7.38905610e+00,\n", " 2.00855369e+01, 5.45981500e+01, 1.48413159e+02,\n", " 4.03428793e+02, 1.09663316e+03, 2.98095799e+03,\n", " 8.10308393e+03])" ] } ], "prompt_number": 104 }, { "cell_type": "code", "collapsed": false, "input": [ "x = np.random.randn(8)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 105 }, { "cell_type": "code", "collapsed": false, "input": [ "y = np.random.randn(8)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 106 }, { "cell_type": "code", "collapsed": false, "input": [ "x" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 107, "text": [ "array([ 0.99819174, -1.67071413, 0.69328763, 1.10724666, 0.06318684,\n", " 1.30097777, 2.39201052, 0.18678585])" ] } ], "prompt_number": 107 }, { "cell_type": "code", "collapsed": false, "input": [ "y" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 108, "text": [ "array([ 1.86216662, -0.60762356, -0.49207699, -1.61177888, -0.77775008,\n", " -0.06480237, -0.48120421, 0.01314353])" ] } ], "prompt_number": 108 }, { "cell_type": "code", "collapsed": false, "input": [ "np.maximum(x,y)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 109, "text": [ "array([ 1.86216662, -0.60762356, 0.69328763, 1.10724666, 0.06318684,\n", " 1.30097777, 2.39201052, 0.18678585])" ] } ], "prompt_number": 109 }, { "cell_type": "code", "collapsed": false, "input": [ "arr = np.random.randn(7)*5" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 110 }, { "cell_type": "code", "collapsed": false, "input": [ "arr" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 111, "text": [ "array([ 1.91395828, -0.42429758, -3.825587 , -2.62878641, 0.11969267,\n", " -5.36031755, 7.21784393])" ] } ], "prompt_number": 111 }, { "cell_type": "code", "collapsed": false, "input": [ "np.modf(arr)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 112, "text": [ "(array([ 0.91395828, -0.42429758, -0.825587 , -0.62878641, 0.11969267,\n", " -0.36031755, 0.21784393]), array([ 1., -0., -3., -2., 0., -5., 7.]))" ] } ], "prompt_number": 112 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Data Processing Using Arrays" ] }, { "cell_type": "code", "collapsed": false, "input": [ "points = np.arange(-5,5,0.01) # 1000 equally spaced points" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 113 }, { "cell_type": "code", "collapsed": false, "input": [ "xs, ys = np.meshgrid(points,points)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 114 }, { "cell_type": "code", "collapsed": false, "input": [ "ys" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 115, "text": [ "array([[-5. , -5. , -5. , ..., -5. , -5. , -5. ],\n", " [-4.99, -4.99, -4.99, ..., -4.99, -4.99, -4.99],\n", " [-4.98, -4.98, -4.98, ..., -4.98, -4.98, -4.98],\n", " ..., \n", " [ 4.97, 4.97, 4.97, ..., 4.97, 4.97, 4.97],\n", " [ 4.98, 4.98, 4.98, ..., 4.98, 4.98, 4.98],\n", " [ 4.99, 4.99, 4.99, ..., 4.99, 4.99, 4.99]])" ] } ], "prompt_number": 115 }, { "cell_type": "code", "collapsed": false, "input": [ "import matplotlib.pyplot as plt" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 116 }, { "cell_type": "code", "collapsed": false, "input": [ "z = np.sqrt(xs**2 + ys**2)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 117 }, { "cell_type": "code", "collapsed": false, "input": [ "z" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 118, "text": [ "array([[ 7.07106781, 7.06400028, 7.05693985, ..., 7.04988652,\n", " 7.05693985, 7.06400028],\n", " [ 7.06400028, 7.05692568, 7.04985815, ..., 7.04279774,\n", " 7.04985815, 7.05692568],\n", " [ 7.05693985, 7.04985815, 7.04278354, ..., 7.03571603,\n", " 7.04278354, 7.04985815],\n", " ..., \n", " [ 7.04988652, 7.04279774, 7.03571603, ..., 7.0286414 ,\n", " 7.03571603, 7.04279774],\n", " [ 7.05693985, 7.04985815, 7.04278354, ..., 7.03571603,\n", " 7.04278354, 7.04985815],\n", " [ 7.06400028, 7.05692568, 7.04985815, ..., 7.04279774,\n", " 7.04985815, 7.05692568]])" ] } ], "prompt_number": 118 }, { "cell_type": "code", "collapsed": false, "input": [ "%pylab inline\n", "plt.imshow(z,cmap=plt.cm.gray); plt.colorbar()\n", "plt.title('Image plot of $\\sqrt{x^2 + y^2}$ for a grid of values')" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Populating the interactive namespace from numpy and matplotlib\n" ] }, { "metadata": {}, "output_type": "pyout", "prompt_number": 123, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 123 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Expressing Conditional Logic as Array Operations" ] }, { "cell_type": "code", "collapsed": false, "input": [ "xarr = np.array([1.1, 1.2, 1.3, 1.4, 1.5])" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 124 }, { "cell_type": "code", "collapsed": false, "input": [ "yarr = np.array([2.1,2.2,2.3,2.4,2.5])" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 125 }, { "cell_type": "code", "collapsed": false, "input": [ "cond = np.array([True, False, True, True, False])" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 126 }, { "cell_type": "code", "collapsed": false, "input": [ "result = [(x if c else y)\n", " for x,y,c in zip(xarr, yarr, cond)]" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 127 }, { "cell_type": "code", "collapsed": false, "input": [ "result" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 128, "text": [ "[1.1000000000000001, 2.2000000000000002, 1.3, 1.3999999999999999, 2.5]" ] } ], "prompt_number": 128 }, { "cell_type": "code", "collapsed": false, "input": [ "result = np.where(cond, xarr, yarr)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 129 }, { "cell_type": "code", "collapsed": false, "input": [ "result" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 130, "text": [ "array([ 1.1, 2.2, 1.3, 1.4, 2.5])" ] } ], "prompt_number": 130 }, { "cell_type": "code", "collapsed": false, "input": [ "arr = np.random.randn(4,4)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 131 }, { "cell_type": "code", "collapsed": false, "input": [ "arr" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 132, "text": [ "array([[ 0.15860243, -0.19025505, -0.28670256, -0.78042955],\n", " [ 0.99593231, 0.67750065, 1.50543254, -0.54876993],\n", " [ 0.01450733, -0.97386191, -0.47407092, 0.47691936],\n", " [-0.90876212, 0.82059069, 0.7958378 , 1.45423948]])" ] } ], "prompt_number": 132 }, { "cell_type": "code", "collapsed": false, "input": [ "np.where(arr>0,2,-2)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 133, "text": [ "array([[ 2, -2, -2, -2],\n", " [ 2, 2, 2, -2],\n", " [ 2, -2, -2, 2],\n", " [-2, 2, 2, 2]])" ] } ], "prompt_number": 133 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Mathematical and Statistical Methods" ] }, { "cell_type": "code", "collapsed": false, "input": [ "arr = np.random.randn(5,4)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 134 }, { "cell_type": "code", "collapsed": false, "input": [ "arr.mean()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 135, "text": [ "0.01162071577157121" ] } ], "prompt_number": 135 }, { "cell_type": "code", "collapsed": false, "input": [ "np.mean(arr)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 136, "text": [ "0.01162071577157121" ] } ], "prompt_number": 136 }, { "cell_type": "code", "collapsed": false, "input": [ "arr.sum()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 137, "text": [ "0.23241431543142421" ] } ], "prompt_number": 137 }, { "cell_type": "code", "collapsed": false, "input": [ "arr.mean(axis=1)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 138, "text": [ "array([ 0.01078394, 0.56975368, 0.08557923, 0.25582785, -0.86384112])" ] } ], "prompt_number": 138 }, { "cell_type": "code", "collapsed": false, "input": [ "arr.sum(0)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 139, "text": [ "array([-0.12054343, -2.49026435, 1.17933985, 1.66388225])" ] } ], "prompt_number": 139 }, { "cell_type": "code", "collapsed": false, "input": [ "arr = np.array([[0,1,2],[3,4,5],[6,7,8]])" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 140 }, { "cell_type": "code", "collapsed": false, "input": [ "arr.cumsum(0)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 142, "text": [ "array([[ 0, 1, 2],\n", " [ 3, 5, 7],\n", " [ 9, 12, 15]])" ] } ], "prompt_number": 142 }, { "cell_type": "code", "collapsed": false, "input": [ "arr.cumprod(1)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 143, "text": [ "array([[ 0, 0, 0],\n", " [ 3, 12, 60],\n", " [ 6, 42, 336]])" ] } ], "prompt_number": 143 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Methods for Boolean Arrays" ] }, { "cell_type": "code", "collapsed": false, "input": [ "arr = randn(100)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 144 }, { "cell_type": "code", "collapsed": false, "input": [ "(arr>0).sum() # number of positive values" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 145, "text": [ "51" ] } ], "prompt_number": 145 }, { "cell_type": "code", "collapsed": false, "input": [ "bools = np.array([False, False, True, False])" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 146 }, { "cell_type": "code", "collapsed": false, "input": [ "bools.any()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 147, "text": [ "True" ] } ], "prompt_number": 147 }, { "cell_type": "code", "collapsed": false, "input": [ "bools.all()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 148, "text": [ "False" ] } ], "prompt_number": 148 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Sorting" ] }, { "cell_type": "code", "collapsed": false, "input": [ "arr = np.random.randn(8)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 149 }, { "cell_type": "code", "collapsed": false, "input": [ "arr" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 150, "text": [ "array([-2.13432211, -0.17830939, -0.5780675 , 0.17706475, -0.99877497,\n", " -0.1909259 , 0.245384 , -0.90764502])" ] } ], "prompt_number": 150 }, { "cell_type": "code", "collapsed": false, "input": [ "arr.sort()" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 151 }, { "cell_type": "code", "collapsed": false, "input": [ "arr" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 152, "text": [ "array([-2.13432211, -0.99877497, -0.90764502, -0.5780675 , -0.1909259 ,\n", " -0.17830939, 0.17706475, 0.245384 ])" ] } ], "prompt_number": 152 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Unique and Other Set Logic" ] }, { "cell_type": "code", "collapsed": false, "input": [ "names = np.array(['Bob','Joe','Will','Bob','Will', 'Joe','Joe'])" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 153 }, { "cell_type": "code", "collapsed": false, "input": [ "np.unique(names)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 154, "text": [ "array(['Bob', 'Joe', 'Will'], \n", " dtype='|S4')" ] } ], "prompt_number": 154 }, { "cell_type": "code", "collapsed": false, "input": [ "sorted(set(names))" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 155, "text": [ "['Bob', 'Joe', 'Will']" ] } ], "prompt_number": 155 }, { "cell_type": "code", "collapsed": false, "input": [ "values = np.array([6,0,0,3,2,5,6])" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 156 }, { "cell_type": "code", "collapsed": false, "input": [ "np.in1d(values,[2,3,6])" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 157, "text": [ "array([ True, False, False, True, True, False, True], dtype=bool)" ] } ], "prompt_number": 157 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Storing arrays on Disk in Binary Format" ] }, { "cell_type": "code", "collapsed": false, "input": [ "arr = np.arange(10)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 158 }, { "cell_type": "code", "collapsed": false, "input": [ "np.save('some_array',arr)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 159 }, { "cell_type": "code", "collapsed": false, "input": [ "np.load('some_array.npy')" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 160, "text": [ "array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])" ] } ], "prompt_number": 160 }, { "cell_type": "code", "collapsed": false, "input": [ "np.savez('array_archive.npz',a=arr,b=arr)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 161 }, { "cell_type": "code", "collapsed": false, "input": [ "arch = np.load('array_archive.npz')" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 162 }, { "cell_type": "code", "collapsed": false, "input": [ "arch['a']" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 163, "text": [ "array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])" ] } ], "prompt_number": 163 }, { "cell_type": "code", "collapsed": false, "input": [ "arch['b']" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 164, "text": [ "array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])" ] } ], "prompt_number": 164 }, { "cell_type": "code", "collapsed": false, "input": [ "!rm array_archive.npz" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 165 }, { "cell_type": "code", "collapsed": false, "input": [ "!rm some_array.npy" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 166 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Linear Algebra" ] }, { "cell_type": "code", "collapsed": false, "input": [ "x = np.array([[1.,2.,3.],[4.,5.,6.]])" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 167 }, { "cell_type": "code", "collapsed": false, "input": [ "y = np.array([[6.,23.], [-1,7], [8,9]])" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 168 }, { "cell_type": "code", "collapsed": false, "input": [ "x" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 169, "text": [ "array([[ 1., 2., 3.],\n", " [ 4., 5., 6.]])" ] } ], "prompt_number": 169 }, { "cell_type": "code", "collapsed": false, "input": [ "y" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 170, "text": [ "array([[ 6., 23.],\n", " [ -1., 7.],\n", " [ 8., 9.]])" ] } ], "prompt_number": 170 }, { "cell_type": "code", "collapsed": false, "input": [ "x.dot(y) # equivalently np.dot(x,y)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 171, "text": [ "array([[ 28., 64.],\n", " [ 67., 181.]])" ] } ], "prompt_number": 171 }, { "cell_type": "code", "collapsed": false, "input": [ "np.dot(x, np.ones(3))" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 172, "text": [ "array([ 6., 15.])" ] } ], "prompt_number": 172 }, { "cell_type": "code", "collapsed": false, "input": [ "np.ones(3).shape" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 173, "text": [ "(3,)" ] } ], "prompt_number": 173 }, { "cell_type": "code", "collapsed": false, "input": [ "from numpy.linalg import inv,qr" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 174 }, { "cell_type": "code", "collapsed": false, "input": [ "X = np.random.randn(5,5)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 175 }, { "cell_type": "code", "collapsed": false, "input": [ "mat = X.T.dot(X)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 176 }, { "cell_type": "code", "collapsed": false, "input": [ "inv(mat)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 177, "text": [ "array([[ 0.55656045, -0.1052293 , 0.54259798, 0.04927059, -0.20943461],\n", " [-0.1052293 , 0.7800284 , -0.51741589, -0.21122656, 0.40304701],\n", " [ 0.54259798, -0.51741589, 1.21249508, 0.28979103, -0.74981628],\n", " [ 0.04927059, -0.21122656, 0.28979103, 0.47800195, -0.49408226],\n", " [-0.20943461, 0.40304701, -0.74981628, -0.49408226, 0.87290569]])" ] } ], "prompt_number": 177 }, { "cell_type": "code", "collapsed": false, "input": [ "mat.dot(inv(mat))" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 178, "text": [ "array([[ 1.00000000e+00, 0.00000000e+00, 2.22044605e-16,\n", " 0.00000000e+00, 0.00000000e+00],\n", " [ -4.85722573e-17, 1.00000000e+00, 1.38777878e-17,\n", " -1.04083409e-16, 2.22044605e-16],\n", " [ -3.33066907e-16, 2.22044605e-16, 1.00000000e+00,\n", " 0.00000000e+00, 4.44089210e-16],\n", " [ 0.00000000e+00, 0.00000000e+00, 4.44089210e-16,\n", " 1.00000000e+00, -4.44089210e-16],\n", " [ -2.22044605e-16, -4.44089210e-16, 8.88178420e-16,\n", " 4.44089210e-16, 1.00000000e+00]])" ] } ], "prompt_number": 178 }, { "cell_type": "code", "collapsed": false, "input": [ "q,r = qr(mat)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 179 }, { "cell_type": "code", "collapsed": false, "input": [ "r" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 180, "text": [ "array([[-5.16468799, 1.57980756, 5.97742386, 3.407923 , 5.41611016],\n", " [ 0. , -1.89127908, -0.6445985 , -0.31264466, 0.34849209],\n", " [ 0. , 0. , -3.01424877, -6.02413598, -6.77379008],\n", " [ 0. , 0. , 0. , -4.00915939, -2.21444492],\n", " [ 0. , 0. , 0. , 0. , 0.75066787]])" ] } ], "prompt_number": 180 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Random number generation" ] }, { "cell_type": "code", "collapsed": false, "input": [ "samples = np.random.normal(size = (4,4))" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 183 }, { "cell_type": "code", "collapsed": false, "input": [ "samples" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 184, "text": [ "array([[-1.40590462, -0.91612122, 0.72683934, 0.2305343 ],\n", " [ 0.49735553, -1.6994437 , -0.06710131, 1.9160297 ],\n", " [-0.44294493, 2.15673576, -0.46160566, -0.1098582 ],\n", " [ 0.9837433 , 0.57693797, -1.48162467, -1.88921783]])" ] } ], "prompt_number": 184 }, { "cell_type": "code", "collapsed": false, "input": [ "N=1000000" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 185 }, { "cell_type": "code", "collapsed": false, "input": [ "from random import normalvariate" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 187 }, { "cell_type": "code", "collapsed": false, "input": [ "%timeit samples = [normalvariate(0,1) for _ in xrange(N)]" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1 loops, best of 3: 1.21 s per loop\n" ] } ], "prompt_number": 188 }, { "cell_type": "code", "collapsed": false, "input": [ "%timeit np.random.normal(size=N)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "10 loops, best of 3: 41.1 ms per loop\n" ] } ], "prompt_number": 189 }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] } ], "metadata": {} } ] }