summaryrefslogtreecommitdiff
path: root/day2
diff options
context:
space:
mode:
authorSantosh G. Vattam2009-10-08 22:48:59 +0530
committerSantosh G. Vattam2009-10-08 22:48:59 +0530
commit7e1335294c63d326a951c0fc5ecf4ee308583f8f (patch)
tree44f6ad4ad4a23246ff176d73ecbf19ca1aa02ab9 /day2
parent5f91fcae4a93410621e09ca6b0f68b37b3f2ab14 (diff)
parent7ffed006a6552f3151888fc8a8008867b119adfb (diff)
downloadworkshops-7e1335294c63d326a951c0fc5ecf4ee308583f8f.tar.gz
workshops-7e1335294c63d326a951c0fc5ecf4ee308583f8f.tar.bz2
workshops-7e1335294c63d326a951c0fc5ecf4ee308583f8f.zip
Branches merged.
Diffstat (limited to 'day2')
-rw-r--r--day2/handout.tex423
-rw-r--r--day2/session1.tex118
-rw-r--r--day2/session2.tex225
-rw-r--r--day2/session3.tex249
-rw-r--r--day2/tda.tex299
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}