diff options
author | Santosh G. Vattam | 2009-10-08 22:48:59 +0530 |
---|---|---|
committer | Santosh G. Vattam | 2009-10-08 22:48:59 +0530 |
commit | 7e1335294c63d326a951c0fc5ecf4ee308583f8f (patch) | |
tree | 44f6ad4ad4a23246ff176d73ecbf19ca1aa02ab9 /day2 | |
parent | 5f91fcae4a93410621e09ca6b0f68b37b3f2ab14 (diff) | |
parent | 7ffed006a6552f3151888fc8a8008867b119adfb (diff) | |
download | workshops-7e1335294c63d326a951c0fc5ecf4ee308583f8f.tar.gz workshops-7e1335294c63d326a951c0fc5ecf4ee308583f8f.tar.bz2 workshops-7e1335294c63d326a951c0fc5ecf4ee308583f8f.zip |
Branches merged.
Diffstat (limited to 'day2')
-rw-r--r-- | day2/handout.tex | 423 | ||||
-rw-r--r-- | day2/session1.tex | 118 | ||||
-rw-r--r-- | day2/session2.tex | 225 | ||||
-rw-r--r-- | day2/session3.tex | 249 | ||||
-rw-r--r-- | day2/tda.tex | 299 |
5 files changed, 1006 insertions, 308 deletions
diff --git a/day2/handout.tex b/day2/handout.tex new file mode 100644 index 0000000..d7df544 --- /dev/null +++ b/day2/handout.tex @@ -0,0 +1,423 @@ +\documentclass[12pt]{article} +\usepackage{amsmath} +\title{Python Workshop\\Problems and Exercises} +\author{Asokan Pichai\\Prabhu Ramachandran} +\begin{document} +\maketitle + +\section{Matrices and Arrays \& 2D Plotting} +\subsection{Matrices and Arrays} +\begin{verbatim} +# Simple array math example +>>> import numpy as np +>>> a = np.array([1,2,3,4]) +>>> b = np.arange(2,6) +>>> b +array([2,3,4,5]) +>>> a*2 + b + 1 # Basic math! +array([5, 8, 11, 14]) + +# Pi and e are defined. +>>> x = np.linspace(0.0, 10.0, 1000) +>>> x *= 2*np.pi/10 # inplace. +# apply functions to array. +>>> y = np.sin(x) +>>> z = np.exp(y) + +>>> x = np.array([1., 2, 3, 4]) +>>> np.size(x) +4 +>>> x.dtype # What is a.dtype? +dtype('float64') +>>> x.shape +(4,) +>>> print np.rank(x), x.itemsize +1 8 +>>> x[0] = 10 +>>> print x[0], x[-1] +10.0 4.0 + +>>> a = np.array([[ 0, 1, 2, 3], +... [10,11,12,13]]) +>>> a.shape # (rows, columns) +(2, 4) +# Accessing and setting values +>>> a[1,3] +13 +>>> a[1,3] = -1 +>>> a[1] # The second row +array([10,11,12,-1]) + +>>> b=np.array([[0,2,4,2],[1,2,3,4]]) +>>> np.add(a,b,a) +>>> np.sum(x,axis=1) + +>>> np.greater(a,4) +>>> np.sqrt(a) + +>>> np.array([2,3,4]) +array([2, 3, 4]) + +>>> np.linspace(0, 2, 4) +array([0.,0.6666667,1.3333333,2.]) + +>>>np.ones([2,2]) +array([[ 1., 1.], + [ 1., 1.]]) + +>>>a = np.array([[1,2,3],[4,5,6]]) +>>>np.ones_like(a) +array([[1, 1, 1], + [1, 1, 1]]) + +>>> a = np.array([[1,2,3], [4,5,6], + [7,8,9]]) +>>> a[0,1:3] +array([2, 3]) +>>> a[1:,1:] +array([[5, 6], + [8, 9]]) +>>> a[:,2] +array([3, 6, 9]) +>>> a[...,2] +array([3, 6, 9]) + +>>> a[0::2,0::2] +array([[1, 3], + [7, 9]]) +# Slices are references to the +# same memory! + +>>> np.random.rand(3,2) +array([[ 0.96276665, 0.77174861], + [ 0.35138557, 0.61462271], + [ 0.16789255, 0.43848811]]) +>>> np.random.randint(1,100) +42 +\end{verbatim} + +\subsection{Problem Set} +\begin{verbatim} + >>> from scipy import misc + >>> A=misc.imread(name) + >>> misc.imshow(A) +\end{verbatim} +\begin{enumerate} + \item Convert an RGB image to Grayscale. $ Y = 0.5R + 0.25G + 0.25B $. + \item Scale the image to 50\%. + \item Introduce some random noise. + \item Smooth the image using a mean filter. + \\\small{Each element in the array is replaced by mean of all the neighbouring elements} + \\\small{How fast does your code run?} +\end{enumerate} + +\subsection{2D Plotting} +\begin{verbatim} +$ ipython -pylab +>>> x = linspace(0, 2*pi, 1000) +>>> plot(x, sin(x)) +>>> plot(x, sin(x), 'ro') +>>> xlabel(r'$\chi$', color='g') +# LaTeX markup! +>>> ylabel(r'sin($\chi$)', color='r') +>>> title('Simple figure', fontsize=20) +>>> savefig('/tmp/test.eps') + +# Set properties of objects: +>>> l, = plot(x, sin(x)) +# Why "l,"? +>>> setp(l, linewidth=2.0, color='r') +>>> l.set_linewidth(2.0) +>>> draw() # Redraw. +>>> setp(l) # Print properties. +>>> clf() # Clear figure. +>>> close() # Close figure. + +>>> w = arange(-2,2,.1) +>>> plot(w,exp(-(w*w))*cos) +>>> ylabel('$f(\omega)$') +>>> xlabel('$\omega$') +>>> title(r"$f(\omega)=e^{-\omega^2} + cos({\omega^2})$") +>>> annotate('maxima',xy=(0, 1), + xytext=(1, 0.8), + arrowprops=dict( + facecolor='black', + shrink=0.05)) + +>>> x = linspace(0, 2*np.pi, 1000) +>>> plot(x, cos(5*x), 'r--', + label='cosine') +>>> plot(x, sin(5*x), 'g--', + label='sine') +>>> legend() +# Or use: +>>> legend(['cosine', 'sine']) + +>>> figure(1) +>>> plot(x, sin(x)) +>>> figure(2) +>>> plot(x, tanh(x)) +>>> figure(1) +>>> title('Easy as 1,2,3') + +\end{verbatim} + +\subsection{Problem Set} + \begin{enumerate} + \item Write a function that plots any regular n-gon given n. + \item Consider the logistic map, $f(x) = kx(1-x)$, plot it for + $k=2.5, 3.5$ and $4$ in the same plot. + + \item Consider the iteration $x_{n+1} = f(x_n)$ where $f(x) = + kx(1-x)$. Plot the successive iterates of this process. + \item Plot this using a cobweb plot as follows: + \begin{enumerate} + \item Start at $(x_0, 0)$ + \item Draw line to $(x_i, f(x_i))$; + \item Set $x_{i+1} = f(x_i)$ + \item Draw line to $(x_i, x_i)$ + \item Repeat from 2 for as long as you want + \end{enumerate} +\end{enumerate} + +\section{Advanced Numpy} + +\subsection{Broadcasting} +\begin{verbatim} +>>> a = np.arange(4) +>>> b = np.arange(5) +>>> a+b +>>> a+3 +>>> c=np.array([3]) +>>> a+c +>>> b+c + +>>> a = np.arange(4) +>>> a+3 +array([3, 4, 5, 6]) + +>>> x = np.ones((3, 5)) +>>> y = np.ones(8) +>>> (x[..., None] + y).shape +(3, 5, 8) + +\end{verbatim} + +\subsection{Copies \& Views} +\begin{verbatim} +>>> a = np.array([[1,2,3],[4,5,6]]) +>>> 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 + +>>> a = np.arange(1,9) +>>> a.shape=3,3 +>>> b = a[0,1:3] +>>> c = a[0::2,0::2] +>>> a.flags.owndata +>>> b.flags.owndata +>>> b.base +>>> c.base is a + +>>> b = a[np.array([0,1,2])] +array([[1, 2, 3], + [4, 5, 6], + [7, 8, 9]]) +>>> b.flags.owndata +>>> abool=np.greater(a,2) +>>> c = a[abool] +>>> c.flags.owndata + +\end{verbatim} + +\section{Scipy} +\subsection{Linear Algebra} +\begin{verbatim} +>>> import scipy as sp +>>> from scipy import linalg +>>> A=sp.mat(np.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, ... + +>>> A = sp.mat(np.arange(1,10)) +>>> A.shape=3,3 +>>> linalg.lu(A) +>>> linalg.eig(A) +>>> linalg.eigvals(A) +\end{verbatim} + +\subsection{Solving Linear Equations} + +\begin{align*} + 3x + 2y - z & = 1 \\ + 2x - 2y + 4z & = -2 \\ + -x + \frac{1}{2}y -z & = 0 +\end{align*} +To Solve this, +\begin{verbatim} +>>> A = sp.mat([[3,2,-1],[2,-2,4] + ,[-1,1/2,-1]]) +>>> B = sp.mat([[1],[-2],[0]]) +>>> linalg.solve(A,B) +\end{verbatim} + +\subsection{Integrate} +\subsubsection{Quadrature} +Calculate the area under $(sin(x) + x^2)$ in the range $(0,1)$ +\begin{verbatim} +>>> def f(x): + return np.sin(x)+x**2 +>>> integrate.quad(f, 0, 1) +\end{verbatim} + +\subsubsection{ODE Integration} +Numerically solve ODEs\\ +\begin{align*} +\frac{dx}{dt} &=-e^{-t}x^2\\ + x(0) &=2 +\end{align*} +\begin{verbatim} +>>> def dx_dt(x,t): +... return -np.exp(-t)*x**2 +>>> x=integrate.odeint(dx_dt, 2, t) +>>> plt.plot(x,t) +\end{verbatim} + +\subsection{Interpolation} +\subsubsection{1D Interpolation} +\begin{verbatim} +>>> from scipy import interpolate +>>> interpolate.interp1d? +>>> x = np.arange(0,2*np.pi,np.pi/4) +>>> y = np.sin(x) +>>> fl = interpolate.interp1d( + x,y,kind='linear') +>>> fc = interpolate.interp1d( + x,y,kind='cubic') +>>> fl(np.pi/3) +>>> fc(np.pi/3) +\end{verbatim} + +\subsubsection{Splines} +Plot the Cubic Spline of $sin(x)$ +\begin{verbatim} +>>> x = np.arange(0,2*np.pi,np.pi/4) +>>> y = np.sin(x) +>>> tck = interpolate.splrep(x,y) +>>> X = np.arange(0,2*np.pi,np.pi/50) +>>> Y = interpolate.splev(X,tck,der=0) +>>> plt.plot(x,y,'o',x,y,X,Y) +>>> plt.show() +\end{verbatim} + +\subsection{Signal \& Image Processing} +Applying a simple median filter +\begin{verbatim} +>>> from scipy import signal, ndimage +>>> from scipy import lena +>>> A=lena().astype('float32') +>>> B=signal.medfilt2d(A) +>>> imshow(B) +\end{verbatim} +Zooming an array - uses spline interpolation +\begin{verbatim} +>>> b=ndimage.zoom(A,0.5) +>>> imshow(b) +\end{verbatim} + +\section{3D Data Visualization} +\subsection{Using mlab} +\begin{verbatim} +>>> from enthought.mayavi import mlab + +>>> mlab.test_<TAB> +>>> mlab.test_contour3d() +>>> mlab.test_contour3d?? +\end{verbatim} + +\subsubsection{Plotting Functions} +\begin{verbatim} +>>> from numpy import * +>>> t = linspace(0, 2*pi, 50) +>>> u = cos(t)*pi +>>> x, y, z = sin(u), cos(u), sin(t) + +>>> x = mgrid[-3:3:100j,-3:3:100j] +>>> z = sin(x*x + y*y) +>>> mlab.surf(x, y, z) +\end{verbatim} + +\subsubsection{Large 2D Data} +\begin{verbatim} +>>> mlab.mesh(x, y, z) + +>>> phi, theta = numpy.mgrid[0:pi:20j, +... 0:2*pi:20j] +>>> x = sin(phi)*cos(theta) +>>> y = sin(phi)*sin(theta) +>>> z = cos(phi) +>>> mlab.mesh(x, y, z, +... representation= +... 'wireframe') +\end{verbatim} + +\subsubsection{Large 3D Data} +\begin{verbatim} +>>> x, y, z = ogrid[-5:5:64j, +... -5:5:64j, +... -5:5:64j] +>>> mlab.contour3d(x*x*0.5 + y*y + + z*z*2) + +>>> mlab.test_quiver3d() +\end{verbatim} + +\subsection{Motivational Problem} +Atmospheric data of temperature over the surface of the earth. Let temperature ($T$) vary linearly with height ($z$)\\ +$T = 288.15 - 6.5z$ + +\begin{verbatim} +lat = linspace(-89, 89, 37) +lon = linspace(0, 360, 37) +z = linspace(0, 100, 11) +\end{verbatim} + +\begin{verbatim} +x, y, z = mgrid[0:360:37j,-89:89:37j, + 0:100:11j] +t = 288.15 - 6.5*z +mlab.contour3d(x, y, z, t) +mlab.outline() +mlab.colorbar() +\end{verbatim} + +\subsection{Lorenz equation} +\begin{eqnarray*} +\frac{d x}{dt} &=& s (y-x)\\ +\frac{d y}{d t} &=& rx -y -xz\\ +\frac{d z}{d t} &=& xy - bz\\ +\end{eqnarray*} + +Let $s=10,$ +$r=28,$ +$b=8./3.$ + +\begin{verbatim} +x, y, z = mgrid[-50:50:20j,-50:50:20j, + -10:60:20j] + +\end{verbatim} + +\end{document} diff --git a/day2/session1.tex b/day2/session1.tex index 53ee07a..1d80bd4 100644 --- a/day2/session1.tex +++ b/day2/session1.tex @@ -146,16 +146,25 @@ \frametitle{Examples of \num} \begin{lstlisting} # Simple array math example ->>> from numpy import * ->>> a = array([1,2,3,4]) ->>> b = array([2,3,4,5]) +>>> import numpy as np +>>> a = np.array([1,2,3,4]) +>>> b = np.arange(2,6) +>>> b +array([2,3,4,5]) >>> a*2 + b + 1 # Basic math! array([5, 8, 11, 14]) +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] + \frametitle{Examples of \num} +\begin{lstlisting} # Pi and e are defined. ->>> x = linspace(0.0, 10.0, 1000) ->>> x *= 2*pi/10 # inplace. +>>> x = np.linspace(0.0, 10.0, 1000) +>>> x *= 2*np.pi/10 # inplace. # apply functions to array. ->>> y = sin(x) +>>> y = np.sin(x) +>>> z = np.exp(y) \end{lstlisting} \inctime{5} \end{frame} @@ -178,14 +187,14 @@ array([5, 8, 11, 14]) \frametitle{More examples of \num} \vspace*{-8pt} \begin{lstlisting} ->>> x = array([1., 2, 3, 4]) ->>> size(x) +>>> x = np.array([1., 2, 3, 4]) +>>> np.size(x) 4 >>> x.dtype # What is a.dtype? dtype('float64') >>> x.shape (4,) ->>> print rank(x), x.itemsize +>>> print np.rank(x), x.itemsize 1 8 >>> x[0] = 10 >>> print x[0], x[-1] @@ -196,7 +205,7 @@ dtype('float64') \begin{frame}[fragile] \frametitle{Multi-dimensional arrays} \begin{lstlisting} ->>> a = array([[ 0, 1, 2, 3], +>>> a = np.array([[ 0, 1, 2, 3], ... [10,11,12,13]]) >>> a.shape # (rows, columns) (2, 4) @@ -206,78 +215,85 @@ dtype('float64') >>> a[1,3] = -1 >>> a[1] # The second row array([10,11,12,-1]) - \end{lstlisting} \end{frame} + \begin{frame}[fragile] \frametitle{Array math} \begin{itemize} \item Basic \alert{elementwise} math (given two arrays \typ{a, b}): \typ{+, -, *, /, \%} - \item Inplace operators: \typ{a += b}, or \typ{add(a, b, a)} etc. - \item \typ{sum(x, axis=0)}, - \typ{product(x, axis=0)}, - \typ{dot(a, bp)} + \item Inplace operators: \typ{a += b}, or \typ{np.add(a, b, a)} etc. + \item \typ{np.sum(x, axis=0)}, + \typ{np.product(x, axis=0)}, + \typ{np.dot(a, bp)} \end{itemize} +\begin{lstlisting} +>>> b=np.array([[0,2,4,2],[1,2,3,4]]) +>>> np.add(a,b,a) +>>> np.sum(x,axis=1) +\end{lstlisting} \end{frame} \begin{frame}[fragile] \frametitle{Array math cont.} \begin{itemize} - \item Logical operations: \typ{equal (==)}, \typ{not\_equal (!=)}, - \typ{less (<)}, \typ{greater (>)} etc. - \item Trig and other functions: \typ{sin(x),} - \typ{arcsin(x), sinh(x),} - \typ{exp(x), sqrt(x)} etc. + \item Logical operations: \typ{np.equal (==)}, \typ{np.not\_equal (!=)}, + \typ{np.less (<)}, \typ{np.greater (>)} etc. + \item Trig and other functions: \typ{np.sin(x),} + \typ{np.arcsin(x), np.sinh(x),} + \typ{np.exp(x), np.sqrt(x)} etc. \end{itemize} +\begin{lstlisting} +>>> np.greater(a,4) +>>> np.sqrt(a) +\end{lstlisting} \inctime{10} \end{frame} \subsection{Array Creation \& Slicing, Striding Arrays} \begin{frame}[fragile] \frametitle{Array creation functions} - \begin {block}{\typ{array(object, dtype=None, ...)}} - \begin{lstlisting} - >>> array( [2,3,4] ) - array([2, 3, 4]) - \end{lstlisting} - \end {block} - \begin{block}{\typ{linspace(start, stop, num=50, ...)}} - \begin{lstlisting} - >>> linspace( 0, 2, 4 ) - array([0.,0.6666667,1.3333333,2.]) - \end{lstlisting} - \end{block} \begin{itemize} - \item also try \typ{arange} command + \item {\typ{np.array(object,dtype=None,...)} + \begin{lstlisting} +>>> np.array([2,3,4]) +array([2, 3, 4]) + \end{lstlisting} + \item \typ{np.linspace(start,stop,...)} + \begin{lstlisting} +>>> np.linspace(0, 2, 4) +array([0.,0.6666667,1.3333333,2.]) + \end{lstlisting} + \item Also try \typ{np.arange} \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Array creation functions cont.} \begin{itemize} - \item \typ{ones(shape, dtype=None, ...)} + \item \typ{np.ones(shape, dtype=None, ...)} \begin{lstlisting} - >>>ones([2,2]) - array([[ 1., 1.], - [ 1., 1.]]) +>>>np.ones([2,2]) +array([[ 1., 1.], + [ 1., 1.]]) \end{lstlisting} - \item \typ{identity(n)} - \item \typ{ones\_like(x)} + \item \typ{np.identity(n)} + \item \typ{np.ones\_like(x)} \begin{lstlisting} - >>>a = array([[1,2,3],[4,5,6]]) - >>>ones_like(a) - array([[1, 1, 1], - [1, 1, 1]]) +>>>a = np.array([[1,2,3],[4,5,6]]) +>>>np.ones_like(a) +array([[1, 1, 1], + [1, 1, 1]]) \end{lstlisting} - \item check out \typ{zeros, zeros\_like, empty} + \item Also try \typ{zeros, zeros\_like, empty} \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Slicing arrays} \begin{lstlisting} ->>> a = array([[1,2,3], [4,5,6], +>>> a = np.array([[1,2,3], [4,5,6], [7,8,9]]) >>> a[0,1:3] array([2, 3]) @@ -327,8 +343,8 @@ array([[ 0.96276665, 0.77174861], \item Scale the image to 50\% \item Introduce some random noise \item Smooth the image using a mean filter - \\\small{Take the mean of all the neighbouring elements} - \\\small{How fast can you do it?} + \\\small{Each element in the array is replaced by mean of all the neighbouring elements} + \\\small{How fast does your code run?} \end{enumerate} \inctime{15} \end{frame} @@ -408,7 +424,7 @@ array([[ 0.96276665, 0.77174861], \begin{frame}[fragile] \frametitle{Legends} \begin{lstlisting} ->>> x = linspace(0, 2*pi, 1000) +>>> x = linspace(0, 2*np.pi, 1000) >>> plot(x, cos(5*x), 'r--', label='cosine') >>> plot(x, sin(5*x), 'g--', @@ -435,7 +451,7 @@ array([[ 0.96276665, 0.77174861], \end{frame} \begin{frame}[fragile] - \frametitle{Note: \typ{pylab} in Python scripts} + \frametitle{\typ{pylab} in Python scripts} \begin{lstlisting} import pylab x = pylab.linspace(0, 20, 1000) @@ -444,7 +460,7 @@ pylab.plot(x, pylab.sin(x)) # Can also use: from pylab import linspace, sin, plot \end{lstlisting} -\inctime{5} +\inctime{10} \end{frame} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -742,7 +758,6 @@ title('triangular head; scale '\ \tiny For details see \url{http://matplotlib.sourceforge.net/screenshots/plotmap.py} \end{center} -\inctime{5} \end{frame} @@ -753,6 +768,7 @@ title('triangular head; scale '\ \item \url{http://matplotlib.sf.net/tutorial.html} \item \url{http://matplotlib.sf.net/screenshots.html} \end{itemize} +\inctime{5} \end{frame} \begin{frame} diff --git a/day2/session2.tex b/day2/session2.tex index bc2b157..9a02146 100644 --- a/day2/session2.tex +++ b/day2/session2.tex @@ -117,34 +117,52 @@ \maketitle \end{frame} +\section{Advanced Numpy} \begin{frame}[fragile] \frametitle{Broadcasting} + Try it! + \begin{lstlisting} + >>> a = np.arange(4) + >>> b = np.arange(5) + >>> a+b + >>> a+3 + >>> c=np.array([3]) + >>> a+c + >>> b+c + \end{lstlisting} \begin{itemize} - \item Used so that functions can take inputs that are not of the same shape. - \item 2 rules - - \begin{enumerate} - \item 1 (repeatedly) pre-pended to shapes of smaller arrays - \item Size 1 in a dimension -> Largest size in that dimension - \end{enumerate} + \item Enter Broadcasting! \end{itemize} +\end{frame} + +\begin{frame}[fragile] + \frametitle{Broadcasting} \begin{columns} \column{0.65\textwidth} \hspace*{-1.5in} \begin{lstlisting} - >>> x = np.arange(4) - >>> x+3 + >>> a = np.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} + \begin{itemize} + \item Allows functions to take inputs not of the same shape + \item 2 rules - + \begin{enumerate} + \item 1 is (repeatedly) prepended to shapes of smaller arrays + \item Size 1 in a dimension changed to Largest size in that dimension + \end{enumerate} + \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Broadcasting in 3D} \begin{lstlisting} - >>> x = np.zeros((3, 5)) - >>> y = np.zeros(8) + >>> x = np.ones((3, 5)) + >>> y = np.ones(8) >>> (x[..., None] + y).shape (3, 5, 8) \end{lstlisting} @@ -157,14 +175,34 @@ \begin{frame}[fragile] \frametitle{Copies \& Views} + Try it! \begin{lstlisting} - >>> a = array([[1,2,3], [4,5,6], - [7,8,9]]) - >>> a[0,1:3] - array([2, 3]) - >>> a[0::2,0::2] - array([[1, 3], - [7, 9]]) + >>> a = np.array([[1,2,3],[4,5,6]]) + >>> 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} + Try it! + \begin{lstlisting} + >>> a = np.arange(1,9) + >>> a.shape=3,3 + >>> 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 @@ -175,37 +213,23 @@ \begin{frame}[fragile] \frametitle{Copies contd \ldots} \begin{lstlisting} - >>> a[np.array([0,1,2])] + >>> b = a[np.array([0,1,2])] array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) + >>> b.flags.owndata + >>> abool=np.greater(a,2) + >>> c = a[abool] + >>> c.flags.owndata \end{lstlisting} \begin{itemize} - \item Index arrays or Boolean arrays produce copies + \item Indexing arrays or Boolean arrays produce copies \end{itemize} \inctime{15} \end{frame} -\begin{frame} - \frametitle{More Numpy Functions \& Methods} - More functions - \begin{itemize} - \item \typ{take} - \item \typ{choose} - \item \typ{where} - \item \typ{compress} - \item \typ{concatenate} - \end{itemize} - Ufunc methods - \begin{itemize} - \item \typ{reduce} - \item \typ{accumulate} - \item \typ{outer} - \item \typ{reduceat} - \end{itemize} -\inctime{5} -\end{frame} - +\section{SciPy} +\subsection{Introduction} \begin{frame} {Intro to SciPy} \begin{itemize} @@ -235,37 +259,72 @@ \end{frame} \begin{frame}[fragile] - \frametitle{Linear Algebra} - \typ{>>> from scipy import linalg} + \frametitle{SciPy - Functions \& Submodules} \begin{itemize} - \item \typ{linalg.det, linalg.norm} - \item \typ{linalg.eig, linalg.lu} - \item \typ{linalg.expm, linalg.logm} - \item \typ{linalg.sinm, linalg.sinhm} + \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} + Try it! + \begin{lstlisting} + >>> import scipy as sp + >>> from scipy import linalg + >>> A=sp.mat(np.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 \ldots} + \frametitle{Linear Algebra ...} + Try it! + \begin{lstlisting} + >>> A = sp.mat(np.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} \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.mat([[3,2,-1],[2,-2,4] + ,[-1,1/2,-1]]) + >>> B = sp.mat([[1],[-2],[0]]) >>> linalg.solve(A,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} - \frametitle{Integrate} - Calculate $\int^1_0sin(x) + x^2$ + Calculate the area under $(sin(x) + x^2)$ in the range $(0,1)$ \begin{lstlisting} >>> def f(x): return np.sin(x)+x**2 @@ -277,39 +336,53 @@ \frametitle{Integrate \ldots} Numerically solve ODEs\\ \begin{align*} - \frac{dx}{dt}&=-e^{(-t)}x^2(t)\\ + \frac{dx}{dt}&=-e^{-t}x^2\\ x(0)&=2 \end{align*} \begin{lstlisting} - def dx_dt(x,t): +>>> def dx_dt(x,t): return -np.exp(-t)*x**2 - x=integrate.odeint(dx_dt, 2, t) - plt.plot(x,t) +>>> 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{itemize} - \item \typ{interpolate.interp1d, ...} - \item \typ{interpolate.splrep, splev} - \end{itemize} - Cubic Spline of $sin(x)$ + Try it! \begin{lstlisting} - x = np.arange(0,2*np.pi,np.pi/8) - y = np.sin(x) - t = interpolate.splrep(x,y,s=0) - X = np.arange(0,2*np.pi,np.pi/50) - Y = interpolate.splev(X,t,der=0) - - plt.plot(x,y,'o',x,y,X,Y) - plt.show() +>>> from scipy import interpolate +>>> interpolate.interp1d? +>>> x = np.arange(0,2*np.pi,np.pi/4) +>>> y = np.sin(x) +>>> fl = interpolate.interp1d( + x,y,kind='linear') +>>> fc = interpolate.interp1d( + x,y,kind='cubic') +>>> fl(np.pi/3) +>>> fc(np.pi/3) + \end{lstlisting} +\end{frame} + +\begin{frame}[fragile] + \frametitle{Interpolation - Splines} + Plot the Cubic Spline of $sin(x)$ + \begin{lstlisting} +>>> x = np.arange(0,2*np.pi,np.pi/4) +>>> y = np.sin(x) +>>> tck = interpolate.splrep(x,y) +>>> X = np.arange(0,2*np.pi,np.pi/50) +>>> Y = interpolate.splev(X,tck,der=0) +>>> plt.plot(x,y,'o',x,y,X,Y) +>>> plt.show() \end{lstlisting} \inctime{10} \end{frame} +\subsection{Signal Processing} \begin{frame}[fragile] \frametitle{Signal \& Image Processing} \begin{itemize} @@ -330,19 +403,18 @@ \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) +>>> 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) - \inctime{5} +>>> b=ndimage.zoom(A,0.5) +>>> imshow(b) \end{lstlisting} - + \inctime{5} \end{frame} \begin{frame}[fragile] @@ -351,7 +423,8 @@ \begin{equation*} \frac{d^2x}{dt^2}+\mu(x^2-1)\frac{dx}{dt}+x= 0 \end{equation*} -\inctime{25} + Make a plot of $\frac{dx}{dt}$ vs. $x$. +\inctime{30} \end{frame} @@ -362,5 +435,3 @@ - random number generation. - Image manipulation: jigsaw puzzle. - Monte-carlo integration. - - diff --git a/day2/session3.tex b/day2/session3.tex index d2daa20..8154c74 100644 --- a/day2/session3.tex +++ b/day2/session3.tex @@ -22,7 +22,7 @@ \mode<presentation> { - \usetheme{CambridgeUS} + \usetheme{Warsaw} %\usetheme{Boadilla} %\usetheme{default} \useoutertheme{split} @@ -95,7 +95,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Title page -\title[]{3D data Vizualization\\ \& \\Test Driven Approach} +\title[]{3D data Visualization} \author[FOSSEE Team] {Asokan Pichai\\Prabhu Ramachandran} @@ -192,7 +192,67 @@ \inctime{10} \end{frame} -\section{Tools at your disposal:} +\section{Tools at your disposal} + +\subsection{Mayavi2.0} + +\begin{frame} + \frametitle{Introduction to Mayavi} + \begin{itemize} + \item Most scientists not interested in details of visualization + \item Visualization of data files with a nice UI + \item Interactive visualization of data (think Matlab) + \item Embedding visualizations in applications + \item Customization + \end{itemize} + \pause + \begin{block}{The Goal} + Provide a \alert{flexible} library/app for every one of these needs! + \end{block} +\end{frame} + +\begin{frame} + {Overview of features} + \vspace*{-0.3in} + \begin{center} + \hspace*{-0.2in}\pgfimage[width=5in]{MEDIA/m2/m2_app3_3} + \end{center} +\end{frame} + + +\begin{frame} + \frametitle{Mayavi in applications} + \vspace*{-0.3in} + \begin{center} + \hspace*{-0.2in}\pgfimage[width=4.5in]{MEDIA/m2/m2_envisage} + \end{center} +\end{frame} + +\begin{frame} + {Exploring the documentation} + \begin{center} + \pgfimage[width=4in]{MEDIA/m2/m2_ug_doc} + \end{center} +\end{frame} + + +\begin{frame} + \frametitle{Summary} + \begin{itemize} + \item \url{http://code.enthought.com/projects/mayavi} + \item Uses VTK (\url{www.vtk.org}) + \item BSD license + \item Linux, win32 and Mac OS X + \item Highly scriptable + \item Embed in Traits UIs (wxPython and PyQt4) + \item Envisage Plugins + \item Debian/Ubuntu/Fedora + \item \alert{Pythonic} + \end{itemize} + + \inctime{10} + +\end{frame} \subsection{mlab} @@ -220,7 +280,7 @@ \end{frame} \begin{frame}[fragile] - \frametitle{Using mlab:} + \frametitle{Using mlab} \begin{lstlisting} >>> from enthought.mayavi import mlab @@ -228,7 +288,7 @@ \vspace*{0.5in} - \myemph{\Large Try these:} + \myemph{\Large Try these} \vspace*{0.25in} @@ -249,7 +309,7 @@ \item Mouse \item Keyboard \item Toolbar - \item Mayavi icon(wait for it...) \pgfimage[width=0.2in]{MEDIA/m2/m2_icon} + \item Mayavi icon\pgfimage[width=0.2in]{MEDIA/m2/m2_icon} \end{itemize} \end{columns} \end{frame} @@ -319,7 +379,8 @@ >>> y = sin(phi)*sin(theta) >>> z = cos(phi) >>> mlab.mesh(x, y, z, -... representation='wireframe') +... representation= +... 'wireframe') \end{lstlisting} \end{frame} @@ -356,66 +417,6 @@ \inctime{20} \end{frame} -\subsection{Mayavi2.0} - -\begin{frame} - \frametitle{Introduction to Mayavi} - \begin{itemize} - \item Most scientists not interested in details of visualization - \item Visualization of data files with a nice UI - \item Interactive visualization of data (think Matlab) - \item Embedding visualizations in applications - \item Customization - \end{itemize} - \pause - \begin{block}{The Goal} - Provide a \alert{flexible} library/app for every one of these needs! - \end{block} -\end{frame} - -\begin{frame} - {Overview of features} - \vspace*{-0.3in} - \begin{center} - \hspace*{-0.2in}\pgfimage[width=5in]{MEDIA/m2/m2_app3_3} - \end{center} -\end{frame} - - -\begin{frame} - \frametitle{Mayavi in applications} - \vspace*{-0.3in} - \begin{center} - \hspace*{0.2in}\pgfimage[width=4.5in]{MEDIA/m2/m2_envisage} - \end{center} -\end{frame} - -\begin{frame} - {Exploring the documentation} - \begin{center} - \pgfimage[width=4.5in]{MEDIA/m2/m2_ug_doc} - \end{center} -\end{frame} - - -\begin{frame} - \frametitle{Summary} - \begin{itemize} - \item \url{http://code.enthought.com/projects/mayavi} - \item Uses VTK (\url{www.vtk.org}) - \item BSD license - \item Linux, win32 and Mac OS X - \item Highly scriptable - \item Embed in Traits UIs (wxPython and PyQt4) - \item Envisage Plugins - \item Debian/Ubuntu/Fedora - \item \alert{Pythonic} - \end{itemize} - - \inctime{10} - -\end{frame} - \begin{frame} {Getting hands dirty!} @@ -468,118 +469,6 @@ x, y, z = mgrid[-50:50:20j,-50:50:20j, \end{lstlisting} \inctime{20} \end{frame} - -\section{Test Driven Approach} - -\begin{frame} - \frametitle{Testing code with \typ{nosetests}} - - \begin{itemize} - \item Writing tests is really simple! - - \item Using nose - - \item Example! - \end{itemize} -\end{frame} - -\begin{frame} - \frametitle{Need of Testing!} - - \begin{itemize} - \item Quality - - \item Regression - - \item Documentation - \end{itemize} -\end{frame} - -\begin{frame}[fragile] - \frametitle{Nosetest} - \begin{lstlisting} -def gcd(a, b): - """Returns gcd of a and b, - handles only positive numbers.""" - if a%b == 0: return b - return gcd(b, a%b) -def lcm(a, b): - return a*b/gcd(a, b) - -if __name__ == '__main__': - import nose - nose.main() - \end{lstlisting} -\inctime{15} -\end{frame} - -\begin{frame}[fragile] - \frametitle{Example} - \begin{block}{Problem Statement:} - Write a function to check whether a given input - string is a palindrome. - \end{block} -\end{frame} - -\begin{frame}[fragile] - \frametitle{Function: code.py} -\begin{lstlisting} -def is_palindrome(input_str): - return input_str == input_str[::-1] -\end{lstlisting} -\end{frame} - -\begin{frame}[fragile] - \frametitle{Test for the palindrome: code.py} -\begin{lstlisting} -from code import is_palindrome -def test_function_normal_words(): - input = "noon" - assert is_palindrome(input) == True -\end{lstlisting} -\end{frame} - -\begin{frame}[fragile] - \frametitle{Running the tests.} -\begin{lstlisting} -$ nosetests test.py -. ----------------------------------------------- -Ran 1 test in 0.001s - -OK -\end{lstlisting} -\end{frame} - -\begin{frame}[fragile] - \frametitle{Exercise: Including new tests.} -\begin{lstlisting} -def test_function_ignore_cases_words(): - input = "Noon" - assert is_palindrome(input) == True -\end{lstlisting} -Check - -\PythonCode{$ nosetests test.py} - -Tweak the code to pass this test. -\end{frame} - -\begin{frame}[fragile] - \frametitle{Exercise: Some more tests.} -\begin{lstlisting} -def test_function_ignore_spaces_in_text(): - input = "ab raca carba" - assert is_palindrome(input) == True -\end{lstlisting} -Check - -\PythonCode{$ nosetests test.py} - -Tweak the code to pass this test. - -\inctime{15} -\end{frame} - + \end{document} diff --git a/day2/tda.tex b/day2/tda.tex new file mode 100644 index 0000000..ae39f4a --- /dev/null +++ b/day2/tda.tex @@ -0,0 +1,299 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Tutorial slides on Python. +% +% Author: Prabhu Ramachandran <prabhu at aero.iitb.ac.in> +% Copyright (c) 2005-2009, Prabhu Ramachandran +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\documentclass[compress,14pt]{beamer} +% \documentclass[handout]{beamer} +% \usepackage{pgfpages} +% \pgfpagesuselayout{4 on 1}[a4paper,border, shrink=5mm,landscape] +\usepackage{tikz} +\newcommand{\hyperlinkmovie}{} +%\usepackage{movie15} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Note that in presentation mode +% \paperwidth 364.19536pt +% \paperheight 273.14662pt +% h/w = 0.888 + + +\mode<presentation> +{ + \usetheme{Warsaw} + %\usetheme{Boadilla} + %\usetheme{default} + \useoutertheme{split} + \setbeamercovered{transparent} +} + +% To remove navigation symbols +\setbeamertemplate{navigation symbols}{} + +\usepackage{amsmath} +\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} +\usepackage{pgf} + +\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} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% My Macros +\setbeamercolor{postit}{bg=yellow,fg=black} +\setbeamercolor{emphbar}{bg=blue!20, fg=black} +\newcommand{\emphbar}[1] +{\begin{beamercolorbox}[rounded=true]{emphbar} + {#1} + \end{beamercolorbox} +} +%{\centerline{\fcolorbox{gray!50} {blue!10}{ +%\begin{minipage}{0.9\linewidth} +% {#1} +%\end{minipage} +% }}} + +\newcommand{\myemph}[1]{\structure{\emph{#1}}} +\newcommand{\PythonCode}[1]{\lstinline{#1}} + +\newcommand{\tvtk}{\texttt{tvtk}} +\newcommand{\mlab}{\texttt{mlab}} + +\newcounter{time} +\setcounter{time}{0} +\newcommand{\inctime}[1]{\addtocounter{time}{#1}{\vspace*{0.1in}\tiny \thetime\ m}} + +\newcommand\BackgroundPicture[1]{% + \setbeamertemplate{background}{% + \parbox[c][\paperheight]{\paperwidth}{% + \vfill \hfill + \hfill \vfill +}}} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Configuring the theme +%\setbeamercolor{normal text}{fg=white} +%\setbeamercolor{background canvas}{bg=black} + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Title page +\title[]{Test Driven Approach} + +\author[FOSSEE Team] {Asokan Pichai\\Prabhu Ramachandran} + +\institute[IIT Bombay] {Department of Aerospace Engineering\\IIT Bombay} +\date[] {11, October 2009} +\date[] % (optional) +} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%\pgfdeclareimage[height=0.75cm]{iitblogo}{iitblogo} +%\logo{\pgfuseimage{iitblogo}} + +\AtBeginSection[] +{ + \begin{frame}<beamer> + \frametitle{Outline} + \Large + \tableofcontents[currentsection,currentsubsection] + \end{frame} +} + +%% 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} +} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% DOCUMENT STARTS +\begin{document} + +\begin{frame} + \maketitle +\end{frame} + +\section{Test Driven Approach} + +\begin{frame} + \frametitle{Testing code with \typ{nosetests}} + + \begin{itemize} + \item Writing tests is really simple! + + \item Using nose. + + \item Example! + \end{itemize} +\end{frame} + +\begin{frame} + \frametitle{Need of Testing!} + + \begin{itemize} + \item Quality + + \item Regression + + \item Documentation + \end{itemize} +\end{frame} + +\begin{frame}[fragile] + \frametitle{Nosetest} + \begin{lstlisting} +def gcd(a, b): + """Returns gcd of a and b, + handles only positive numbers.""" + if a%b == 0: return b + return gcd(b, a%b) +def lcm(a, b): + return a*b/gcd(a, b) + +if __name__ == '__main__': + import nose + nose.main() + \end{lstlisting} +\inctime{10} +\end{frame} + +\begin{frame}[fragile] + \frametitle{Example} + \begin{block}{Problem Statement:} + Write a function to check whether a given input + string is a palindrome. + \end{block} +\end{frame} + +\begin{frame}[fragile] + \frametitle{Function: palindrome.py} +\begin{lstlisting} +def is_palindrome(input_str): + return input_str == input_str[::-1] +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] + \frametitle{Test for the palindrome: palindrome.py} +\begin{lstlisting} +from plaindrome import is_palindrome +def test_function_normal_words(): + input = "noon" + assert is_palindrome(input) == True +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] + \frametitle{Running the tests.} +\begin{lstlisting} +$ nosetests test.py +. +---------------------------------------------- +Ran 1 test in 0.001s + +OK +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] + \frametitle{Exercise: Including new tests.} +\begin{lstlisting} +def test_function_ignore_cases_words(): + input = "Noon" + assert is_palindrome(input) == True +\end{lstlisting} + \vspace*{0.25in} + Check\\ + \PythonCode{$ nosetests test.py} \\ + \begin{block}{Task} + Tweak the code to pass this test. + \end{block} +\end{frame} + +%\begin{frame}[fragile] +% \frametitle{Lets write some test!} +%\begin{lstlisting} +%#for form of equation y=mx+c +%#given m and c for two equation, +%#finding the intersection point. +%def intersect(m1,c1,m2,c2): +% x = (c2-c1)/(m1-m2) +% y = m1*x+c1 +% return (x,y) +%\end{lstlisting} +% +%Create a simple test for this +% +%function which will make it fail. +% +%\inctime{15} +%\end{frame} +% + +\begin{frame}[fragile] + \frametitle{Exercise} + Based on Euclid's theorem: + $gcd(a,b)=gcd(b,b\%a)$\\ + gcd function can be written as: + \begin{lstlisting} + def gcd(a, b): + if a%b == 0: return b + return gcd(b, a%b) + \end{lstlisting} + \begin{block}{Task} + For given gcd implementation write + at least two tests. + \end{block} + \begin{block}{Task} + Write a non recursive implementation + of gcd(), and test it using already + written tests. + \end{block} + +\inctime{15} +\end{frame} + +\begin{frame}{In this session we have covered:} + \begin{itemize} + \item Need for visualization. + \item Tools available. + \item How to follow Test Driven Approach. + \end{itemize} +\end{frame} +\begin{frame} + \begin{center} + \Huge + Thank you! + \end{center} +\end{frame} + +\end{document} |