%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %Tutorial slides on Python. % % Author: FOSSEE % Copyright (c) 2009, FOSSEE, IIT Bombay %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \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 { \usetheme{Warsaw} \useoutertheme{infolines} \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}}} } \newcommand{\num}{\texttt{numpy}} %%% 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[NumPy arrays]{Introductory Scientific Computing with Python} \subtitle{NumPy arrays} \author[FOSSEE] {FOSSEE} \institute[FOSSEE -- IITB] {Department of Aerospace Engineering\\IIT Bombay} \date[] {Mumbai, India} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %\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} \frametitle{Outline} \tableofcontents[currentsection,currentsubsection] \end{frame} } \AtBeginSection[] { \begin{frame} \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} \titlepage \end{frame} \begin{frame} \frametitle{Outline} \tableofcontents % You might wish to add the option [pausesections] \end{frame} \section{\num\ arrays} \begin{frame}[fragile] \frametitle{The \num\ module} \begin{itemize} \item Efficient, powerful array type \item Abstracts out standard operations on arrays \item Convenience functions \item \typ{ipython --pylab} imports part of numpy \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Without Pylab} \begin{lstlisting} In []: from numpy import * In []: x = linspace(0, 1) \end{lstlisting} Note that we had done this ``import'' earlier! \begin{lstlisting} # Can also do this: In []: import numpy In []: x = numpy.linspace(0, 1) # or In []: import numpy as np In []: x = np.linspace(0, 1) \end{lstlisting} Note the use of \typ{numpy.linspace} \end{frame} \begin{frame} \frametitle{\num\ arrays} \begin{itemize} \item Fixed size (\typ{arr.size}) \item Same type (\typ{arr.dtype}) \item Arbitrary dimensionality: \typ{arr.shape} \item \typ{shape}: extent (size) along each dimension \item \typ{arr.itemsize}: number of bytes per element \item \alert{Note:} \typ{shape} can change so long as the \typ{size} is constant \item Indices start from 0 \item Negative indices work like lists \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{\num\ arrays} \begin{lstlisting} In []: a = array([1,2,3,4]) In []: b = array([2,3,4,5]) In []: print(a[0], a[-1]) (1, 4) In []: a[0] = -1 In []: a[0] = 1 \end{lstlisting} Operations are elementwise \end{frame} \begin{frame}[fragile] \frametitle{Simple operations} \begin{lstlisting} In []: a + b Out[]: array([3, 5, 7, 9]) In []: a*b Out[]: array([2, 6, 12, 20]) In []: a/b Out[]: array([0, 0, 0, 0]) \end{lstlisting} \begin{itemize} \item Operations are \alert{element-wise} \item Types matter (only on Python 2.x) \end{itemize} \inctime{10} \end{frame} \begin{frame}[fragile] \frametitle{Data type matters} Try again with this: \begin{lstlisting} In []: a = array([1.,2,3,4]) In []: a/b \end{lstlisting} This can happen on Python 2.x, so beware \end{frame} \begin{frame}[fragile] \frametitle{Examples} \noindent \typ{pi} and \typ{e} are defined. \begin{lstlisting} In []: x = linspace(0.0, 10.0, 200) In []: x *= 2*pi/10 # apply functions to array. In []: y = sin(x) In []: y = cos(x) In []: x[0] = -1 In []: print(x[0], x[-1]) (-1.0, 10.0) \end{lstlisting} \end{frame} \begin{frame}[fragile] \frametitle{\typ{size, shape, rank} etc.} \vspace*{-8pt} \begin{lstlisting} In []: x = array([1., 2, 3, 4]) In []: size(x) Out[]: 4 In []: x.dtype dtype('float64') In []: x.shape Out[] (4,) In []: rank(x) Out[]: 1 In []: x.itemsize Out[]: 8 \end{lstlisting} \end{frame} \begin{frame}[fragile] \frametitle{Multi-dimensional arrays} \begin{lstlisting} In []: a = array([[ 0, 1, 2, 3], ...: [10,11,12,13]]) In []: a.shape # (rows, columns) Out[]: (2, 4) In []: a[1,3] Out[]: 13 In []: a[1,3] = -1 In []: a[1] # The second row array([10,11,12,-1]) In []: a[1] = 0 # Entire row to zero. \end{lstlisting} \inctime{10} \end{frame} \subsection{Slicing arrays} \begin{frame}[plain,fragile] \frametitle{Slicing arrays} \vspace*{-0.2in} \begin{lstlisting} In []: a = array([[1,2,3], [4,5,6], ...: [7,8,9]]) In []: a[0,1:3] \end{lstlisting} \pause \vspace*{-0.1in} \begin{lstlisting} Out[]: array([2, 3]) In []: a[1:,1:] \end{lstlisting} \pause \vspace*{-0.1in} \begin{lstlisting} Out[]: array([[5, 6], [8, 9]]) In []: a[:,2] \end{lstlisting} \pause \vspace*{-0.1in} \begin{lstlisting} Out[]: array([3, 6, 9]) \end{lstlisting} \end{frame} \begin{frame}[plain,fragile] \frametitle{Slicing arrays ...} \vspace*{-0.2in} \begin{lstlisting} In []: a = array([[1,2,3], [4,5,6], ...: [7,8,9]]) In []: a[0::2,0::2] # Striding... \end{lstlisting} \pause \vspace*{-0.1in} \begin{lstlisting} Out[]: array([[1, 3], [7, 9]]) # Slices refer to the same memory! \end{lstlisting} \end{frame} \subsection{Array creation} \begin{frame}[fragile] \frametitle{Array creation functions} \begin{itemize} \item \typ{array(object)} \item \typ{linspace(start, stop, num=50)} \item \typ{ones(shape)} \item \typ{zeros((d1,...,dn))} \item \typ{empty((d1,...,dn))} \item \typ{identity(n)} \item \typ{ones\_like(x)}, \typ{zeros\_like(x)}, \typ{empty\_like(x)} \end{itemize} May pass an optional \typ{dtype=} keyword argument For more dtypes see: \typ{numpy.typeDict} \end{frame} \begin{frame}[fragile] \frametitle{Creation examples} \vspace*{-0.25in} \begin{lstlisting} In []: a = array([1,2,3], dtype=float) In []: ones_like(a) Out[]: array([ 1., 1., 1.]) In []: ones( (2, 3) ) Out[]: array([[ 1., 1., 1.], [ 1., 1., 1.]]) In []: identity(3) Out[]: array([[ 1., 0., 0.], [ 0., 1., 0.], [ 0., 0., 1.]]) \end{lstlisting} \inctime{15} \end{frame} \begin{frame}[fragile] \frametitle{Array math} \begin{itemize} \item Basic \alert{elementwise} math (given two arrays \typ{a, b}): \begin{itemize} \item \typ{a + b} $\rightarrow$ \typ{add(a, b)} \item \typ{a - b}, $\rightarrow$ \typ{subtract(a, b)} \item \typ{a * b}, $\rightarrow$ \typ{multiply(a, b)} \item \typ{a / b}, $\rightarrow$ \typ{divide(a, b)} \item \typ{a \% b}, $\rightarrow$ \typ{remainder(a, b)} \item \typ{a ** b}, $\rightarrow$ \typ{power(a, b)} \end{itemize} \item Inplace operators: \typ{a += b}, or \typ{add(a, b, a)} \alert{What happens if \typ{a} is \typ{int} and \typ{b} is \typ{float?}} \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Array math} \begin{itemize} \item Logical operations: \typ{==, !=, <, >}, etc. \item \typ{sin(x), arcsin(x), sinh(x)}, \typ{exp(x), sqrt(x)} etc. \item \typ{sum(x, axis=0), product(x, axis=0)} \item \typ{dot(a, b)} \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Convenience functions: \typ{loadtxt}} \begin{itemize} \item \typ{loadtxt(file_name)}: loads a text file \item \typ{loadtxt(file_name, unpack=True)}: loads a text file and unpacks columns \end{itemize} \begin{lstlisting} In []: x = loadtxt('pendulum.txt') In []: x.shape Out[]: (90, 2) In []: x, y = loadtxt('pendulum.txt', ...: unpack=True) In []: x.shape Out[]: (90,) \end{lstlisting} \inctime{10} \end{frame} \begin{frame}[fragile] \frametitle{Advanced} \begin{itemize} \item Only scratched the surface of \num \item \typ{reduce, outer} \item Typecasting \item More functions: \typ{take, choose, where}, \typ{compress, concatenate} \item Array broadcasting and \typ{None} \item Record arrays \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Learn more} \small \begin{itemize} \item \url{https://docs.scipy.org/doc/numpy-dev/user/quickstart.html} \item \url{http://numpy.org} \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Recap} \begin{itemize} \item Basic concepts: creation, access, operations \item 1D, multi-dimensional \item Slicing \item Array creation, dtypes \item Math \item \typ{loadtxt} \end{itemize} \inctime{5} \end{frame} \subsection{Example: plotting data from file} \begin{frame}[fragile] \frametitle{Example: plotting data from file} \alert{Data is usually present in a file!} \\ Lets look at the \typ{pendulum.txt} file. \begin{lstlisting} In []: cat pendulum.txt 1.0000e-01 6.9004e-01 1.1000e-01 6.9497e-01 1.2000e-01 7.4252e-01 1.3000e-01 7.5360e-01 \end{lstlisting} \ldots \end{frame} \begin{frame}[fragile] \frametitle{Reading \typ{pendulum.txt}} \begin{itemize} \item File contains L vs.\ T values \item First Column - L values \item Second Column - T values \item Let us generate a plot from the data file \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Gotcha and an aside} Ensure you are in the same directory as \typ{pendulum.txt}\\ if not, do the following on IPython: \begin{lstlisting} In []: %cd directory_containing_file # Check if pendulum.txt is there. In []: ls # Also try In []: !ls \end{lstlisting} \alert{Note:} \typ{\%cd} is an IPython magic command. For more information do: \begin{lstlisting} In []: ? In []: %cd? \end{lstlisting} \end{frame} \begin{frame}[fragile] \frametitle{Exercise} \begin{itemize} \item Plot L versus T square with dots \item No line connecting points \end{itemize} \inctime{10} \end{frame} \begin{frame}[fragile] \frametitle{Solution} \begin{lstlisting} In []: L, t = loadtxt('pendulum.txt', ....: unpack=True) In []: plot(L, t*t, '.') \end{lstlisting} or \begin{lstlisting} In []: x = loadtxt('pendulum.txt') In []: L, t = x[:,0], x[:,1] In []: plot(L, t*t, '.') \end{lstlisting} \end{frame} \begin{frame}[fragile] \begin{figure} \includegraphics[width=3.5in]{data/L-Tsq.png} \end{figure} \end{frame} \begin{frame}[fragile] \frametitle{Odds and ends} \begin{lstlisting} In []: mean(L) Out[]: 0.54499999999999993 In []: std(L) Out[]: 0.25979158313283879 \end{lstlisting} \end{frame} \begin{frame}[fragile] \frametitle{Summary} \begin{itemize} \item Introduction to \num\ arrays \item Slicing arrays \item Multi-dimensional arrays \item Array operations \item Creating arrays \item Loading data from file \end{itemize} \inctime{5} \end{frame} \end{document}