%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Tutorial slides on Python.%% Author: Prabhu Ramachandran <prabhu at aero.iitb.ac.in>% Copyright (c) 2005-2009, Prabhu Ramachandran%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\documentclass[14pt,compress]{beamer}%\documentclass[draft]{beamer}%\documentclass[compress,handout]{beamer}%\usepackage{pgfpages} %\pgfpagesuselayout{2 on 1}[a4paper,border shrink=5mm]% Modified from: generic-ornate-15min-45min.de.tex\mode<presentation>{ \usetheme{Warsaw} \useoutertheme{split} \setbeamercovered{transparent}}\usepackage[english]{babel}\usepackage[latin1]{inputenc}%\usepackage{times}\usepackage[T1]{fontenc}% Taken from Fernando's slides.\usepackage{ae,aecompl}\usepackage{mathpazo,courier,euler}\usepackage[scaled=.95]{helvet}\definecolor{darkgreen}{rgb}{0,0.5,0}\usepackage{listings}\lstset{language=Python, basicstyle=\ttfamily\bfseries, commentstyle=\color{red}\itshape, stringstyle=\color{darkgreen}, showstringspaces=false, keywordstyle=\color{blue}\bfseries}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Macros\setbeamercolor{emphbar}{bg=blue!20, fg=black}\newcommand{\emphbar}[1]{\begin{beamercolorbox}[rounded=true]{emphbar} {#1} \end{beamercolorbox}}\newcounter{time}\setcounter{time}{0}\newcommand{\inctime}[1]{\addtocounter{time}{#1}{\tiny \thetime\ m}}\newcommand{\typ}[1]{\lstinline{#1}}\newcommand{\kwrd}[1]{ \texttt{\textbf{\color{blue}{#1}}} }%%% This is from Fernando's setup.% \usepackage{color}% \definecolor{orange}{cmyk}{0,0.4,0.8,0.2}% % Use and configure listings package for nicely formatted code% \usepackage{listings}% \lstset{% language=Python,% basicstyle=\small\ttfamily,% commentstyle=\ttfamily\color{blue},% stringstyle=\ttfamily\color{orange},% showstringspaces=false,% breaklines=true,% postbreak = \space\dots% }%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Title page\title[]{Numerical Computing with Numpy \& Scipy}\author[FOSSEE Team] {FOSSEE}\institute[IIT Bombay] {Department of Aerospace Engineering\\IIT Bombay}\date[] {11, October 2009}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\pgfdeclareimage[height=0.75cm]{iitmlogo}{iitmlogo}%\logo{\pgfuseimage{iitmlogo}}%% Delete this, if you do not want the table of contents to pop up at%% the beginning of each subsection:\AtBeginSubsection[]{ \begin{frame}<beamer> \frametitle{Outline} \tableofcontents[currentsection,currentsubsection] \end{frame}}\AtBeginSection[]{ \begin{frame}<beamer> \frametitle{Outline} \tableofcontents[currentsection,currentsubsection] \end{frame}}% If you wish to uncover everything in a step-wise fashion, uncomment% the following command: %\beamerdefaultoverlayspecification{<+->}%\includeonlyframes{current,current1,current2,current3,current4,current5,current6}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% DOCUMENT STARTS\begin{document}\begin{frame} \maketitle\end{frame}\section{Advanced Numpy}\begin{frame}[fragile] \frametitle{Broadcasting} \begin{lstlisting} >>> a = arange(4) >>> b = arange(5) >>> a+b #Does this work? >>> a+3 >>> c = array([3]) >>> a+c #Works! >>> b+c #But how? >>> a.shape, b.shape, c.shape \end{lstlisting} \begin{itemize} \item Enter Broadcasting! \end{itemize}\end{frame}\begin{frame}[fragile] \frametitle{Broadcasting} \begin{columns} \column{0.65\textwidth} \hspace*{-1.5in} \begin{lstlisting} >>> a = arange(4) >>> a+3 array([3, 4, 5, 6]) \end{lstlisting} \column{0.35\textwidth} \includegraphics[height=0.7in, interpolate=true]{data/broadcast_scalar} \end{columns}\end{frame}\begin{frame}[fragile] \frametitle{Broadcasting in 3D} \begin{lstlisting} >>> x = ones((3, 5, 1)) >>> y = ones(8) >>> (x + y).shape (3, 5, 8) \end{lstlisting} \begin{figure} \begin{center} \includegraphics[height=1.5in, interpolate=true]{data/array_3x5x8} \end{center} \end{figure}\end{frame}\begin{frame}[fragile] \frametitle{Copies \& Views} \vspace{-0.1in} \begin{lstlisting} >>> a = arange(1,9); a.shape=3,3 >>> b = a >>> b is a >>> b[0,0]=0; print a >>> c = a.view() >>> c is a >>> c.base is a >>> c.flags.owndata >>> d = a.copy() >>> d.base is a >>> d.flags.owndata \end{lstlisting}\end{frame}\begin{frame}[fragile] \frametitle{Copies \& Views} \vspace{-0.1in} \begin{lstlisting} >>> b = a[0,1:3] >>> c = a[0::2,0::2] >>> a.flags.owndata >>> b.flags.owndata >>> b.base >>> c.base is a \end{lstlisting} \begin{itemize} \item Slicing and Striding just reference the same memory \item They produce views of the data, not copies \end{itemize}\end{frame}\begin{frame}[fragile] \frametitle{Copies contd \ldots} \begin{lstlisting} >>> a = arange(1, 10, 2) >>> b = a[array([0,2,3])] >>> b.flags.owndata >>> abool=a>5 >>> c = a[abool] >>> c.flags.owndata \end{lstlisting} \begin{itemize} \item Indexing arrays or Boolean arrays produce copies \end{itemize}\inctime{15}\end{frame}\section{SciPy}\subsection{Introduction}\begin{frame} {Intro to SciPy} \begin{itemize} \item \url{http://www.scipy.org} \item Open source scientific libraries for Python \item Based on NumPy \end{itemize}\end{frame}\begin{frame} \frametitle{SciPy} \begin{itemize} \item Provides: \begin{itemize} \item Linear algebra \item Numerical integration \item Fourier transforms \item Signal processing \item Special functions \item Statistics \item Optimization \item Image processing \item ODE solvers \end{itemize} \item Uses LAPACK, QUADPACK, ODEPACK, FFTPACK etc. from netlib \end{itemize}\end{frame}\begin{frame}[fragile] \frametitle{SciPy - Functions \& Submodules} \begin{itemize} \item All \typ{numpy} functions are in \typ{scipy} namespace \item Domain specific functions organized into subpackages \item Subpackages need to be imported separately \end{itemize} \begin{lstlisting} >>> from scipy import linalg \end{lstlisting}\end{frame}\subsection{Linear Algebra}\begin{frame}[fragile] \frametitle{Linear Algebra} \begin{lstlisting} >>> import scipy as sp >>> from scipy import linalg >>> A = sp.array(sp.arange(1,10)) >>> A.shape = 3,3 >>> linalg.inv(A) >>> linalg.det(A) >>> linalg.norm(A) >>> linalg.expm(A) #logm >>> linalg.sinm(A) #cosm, tanm, ... \end{lstlisting}\end{frame}\begin{frame}[fragile] \frametitle{Linear Algebra ...} \begin{lstlisting} >>> A = sp.array(sp.arange(1,10)) >>> A.shape = 3,3 >>> linalg.lu(A) >>> linalg.eig(A) >>> linalg.eigvals(A) \end{lstlisting}\end{frame}\begin{frame}[fragile] \frametitle{Solving Linear Equations} \vspace{-0.2in} \begin{align*} 3x + 2y - z & = 1 \\ 2x - 2y + 4z & = -2 \\ -x + \frac{1}{2}y -z & = 0 \end{align*} To Solve this, \begin{lstlisting} >>> A = sp.array([[3,2,-1],[2,-2,4] ,[-1,1/2,-1]]) >>> b = sp.array([1,-2,0]) >>> x = linalg.solve(A,b) >>> Ax = sp.dot(A,x) >>> sp.allclose(Ax, b) \end{lstlisting}\inctime{15}\end{frame}\subsection{Integration}\begin{frame}[fragile] \frametitle{Integrate} \begin{itemize} \item Integrating Functions given function object \item Integrating Functions given fixed samples \item Numerical integrators of ODE systems \end{itemize} Calculate the area under $(sin(x) + x^2)$ in the range $(0,1)$ \begin{lstlisting} >>> def f(x): return sin(x)+x**2 >>> integrate.quad(f, 0, 1) \end{lstlisting}\end{frame}\begin{frame}[fragile] \frametitle{Integrate \ldots} Numerically solve ODEs\\ \begin{align*} \frac{dx}{dt}&=-e^{-t}x^2\\ x&=2 \quad at \ t=0 \end{align*} \begin{lstlisting}>>> def dx_dt(x,t): return -exp(-t)*x**2>>> t = linspace(0,2,100)>>> x = integrate.odeint(dx_dt, 2, t)>>> plt.plot(x,t) \end{lstlisting}\inctime{10}\end{frame}\subsection{Interpolation}\begin{frame}[fragile] \frametitle{Interpolation} \begin{lstlisting}>>> from scipy import interpolate>>> interpolate.interp1d?>>> x = arange(0,2*pi,pi/4)>>> y = sin(x)>>> fl = interpolate.interp1d( x,y,kind='linear')>>> fc = interpolate.interp1d( x,y,kind='cubic')>>> fl(pi/3)>>> fc(pi/3) \end{lstlisting}\end{frame}\begin{frame}[fragile] \frametitle{Interpolation - Splines} Plot the Cubic Spline of $sin(x)$ \begin{lstlisting}>>> tck = interpolate.splrep(x,y)>>> xs = arange(0,2*pi,pi/50)>>> ys = interpolate.splev(X,tck,der=0)>>> plt.plot(x,y,'o',x,y,xs,ys)>>> plt.show() \end{lstlisting}\inctime{10}\end{frame}\subsection{Signal Processing}\begin{frame}[fragile] \frametitle{Signal \& Image Processing} \begin{itemize} \item Convolution \item Filtering \item Filter design \item IIR filter design \item Linear Systems \item LTI Representations \item Window functions \end{itemize}\end{frame}\begin{frame}[fragile] \frametitle{Signal \& Image Processing} Applying a simple median filter \begin{lstlisting}>>> from scipy import signal, ndimage>>> from scipy import lena>>> A = lena().astype('float32')>>> B = signal.medfilt2d(A)>>> imshow(B) \end{lstlisting} Zooming an array - uses spline interpolation \begin{lstlisting}>>> b = ndimage.zoom(A,0.5)>>> imshow(b)>>> b = ndimage.zoom(A,2) \end{lstlisting} \inctime{5}\end{frame}\begin{frame}[fragile] \frametitle{Problems} The Van der Pol oscillator is a type of nonconservative oscillator with nonlinear damping. It evolves in time according to the second order differential equation: \begin{equation*} \frac{d^2x}{dt^2}+\mu(x^2-1)\frac{dx}{dt}+x= 0 \end{equation*} Make a plot of $\frac{dx}{dt}$ vs. $x$.\inctime{30}\end{frame}\begin{frame}{Summary} \begin{itemize} \item Advanced NumPy \item SciPy \begin{itemize} \item Linear Algebra \item Integration \item Interpolation \item Signal and Image processing \end{itemize} \end{itemize}\end{frame}\end{document}- Numpy arrays (30 mins) - Matrices - random number generation. - Image manipulation: jigsaw puzzle. - Monte-carlo integration.