Python Crash Course Numpy 3 rd year Bachelors V1.0 dd 04-09-2013 Hour 5.

22
Python Crash Course Python Crash Course Numpy Numpy 3 rd year Bachelors V1.0 dd 04-09-2013 Hour 5

Transcript of Python Crash Course Numpy 3 rd year Bachelors V1.0 dd 04-09-2013 Hour 5.

Page 1: Python Crash Course Numpy 3 rd year Bachelors V1.0 dd 04-09-2013 Hour 5.

Python Crash CoursePython Crash CourseNumpyNumpy

3rd year Bachelors

V1.0

dd 04-09-2013

Hour 5

Page 2: Python Crash Course Numpy 3 rd year Bachelors V1.0 dd 04-09-2013 Hour 5.

Scientific Python?Scientific Python?

• Extra features required:– fast, multidimensional arrays– libraries of reliable, tested scientific functions– plotting tools

2

Page 3: Python Crash Course Numpy 3 rd year Bachelors V1.0 dd 04-09-2013 Hour 5.

Arrays – Numerical Python (Numpy)Arrays – Numerical Python (Numpy)

• Lists ok for storing small amounts of one-dimensional data

• But, can’t use directly with arithmetical operators (+, -, *, /, …)• Need efficient arrays with arithmetic and better multidimensional

tools• Numpy• Similar to lists, but much more capable, except fixed size

>>> a = [1,3,5,7,9]

>>> print(a[2:4])

[5, 7]

>>> b = [[1, 3, 5, 7, 9], [2, 4, 6, 8, 10]]

>>> print(b[0])

[1, 3, 5, 7, 9]

>>> print(b[1][2:4])

[6, 8]

>>> import numpy

>>> a = [1,3,5,7,9]

>>> b = [3,5,6,7,9]

>>> c = a + b

>>> print c

[1, 3, 5, 7, 9, 3, 5, 6, 7, 9]

Page 4: Python Crash Course Numpy 3 rd year Bachelors V1.0 dd 04-09-2013 Hour 5.

Numpy – N-dimensional Array manpulationsNumpy – N-dimensional Array manpulations

The fundamental library needed for scientific computing with Python is called NumPy. This Open Source library contains:•a powerful N-dimensional array object•advanced array slicing methods (to select array elements)•convenient array reshaping methods

and it even contains 3 libraries with numerical routines:•basic linear algebra functions•basic Fourier transforms•sophisticated random number capabilities

NumPy can be extended with C-code for functions where performance is highly time critical. In addition, tools are provided for integrating existing Fortran code. NumPy is a hybrid of the older NumArray and Numeric packages, and is meant to replace them both.

Page 5: Python Crash Course Numpy 3 rd year Bachelors V1.0 dd 04-09-2013 Hour 5.

Numpy - ndarrayNumpy - ndarray

• NumPy's main object is the homogeneous multidimensional array called ndarray.

– This is a table of elements (usually numbers), all of the same type, indexed by a tuple of positive integers. Typical examples of multidimensional arrays include vectors, matrices, images and spreadsheets.

– Dimensions usually called axes, number of axes is the rank

[7, 5, -1] An array of rank 1 i.e. It has 1 axis of length 3

[ [ 1.5, 0.2, -3.7] , An array of rank 2 i.e. It has 2 axes, the first [ 0.1, 1.7, 2.9] ] length 3, the second of length 3 (a matrix

with 2 rows and 3 columns

>>> a = numpy.array([1,3,5,7,9])

>>> b = numpy.array([3,5,6,7,9])

>>> c = a + b

>>> print c

[4, 8, 11, 14, 18]

Page 6: Python Crash Course Numpy 3 rd year Bachelors V1.0 dd 04-09-2013 Hour 5.

Numpy – ndarray attributesNumpy – ndarray attributes

• ndarray.ndim– the number of axes (dimensions) of the array i.e. the rank.

• ndarray.shape– the dimensions of the array. This is a tuple of integers indicating the size of the array in each

dimension. For a matrix with n rows and m columns, shape will be (n,m). The length of the shape tuple is therefore the rank, or number of dimensions, ndim.

• ndarray.size– the total number of elements of the array, equal to the product of the elements of shape.

• ndarray.dtype– an object describing the type of the elements in the array. One can create or specify dtype's

using standard Python types. NumPy provides many, for example bool_, character, int_, int8, int16, int32, int64, float_, float8, float16, float32, float64, complex_, complex64, object_.

• ndarray.itemsize– the size in bytes of each element of the array. E.g. for elements of type float64, itemsize is 8

(=64/8), while complex32 has itemsize 4 (=32/8) (equivalent to ndarray.dtype.itemsize).

• ndarray.data– the buffer containing the actual elements of the array. Normally, we won't need to use this

attribute because we will access the elements in an array using indexing facilities.

Page 7: Python Crash Course Numpy 3 rd year Bachelors V1.0 dd 04-09-2013 Hour 5.

Numpy – array creation and useNumpy – array creation and use

>>> import numpy

>>> l = [[1, 2, 3], [3, 6, 9], [2, 4, 6]] # create a list

>>> a = numpy.array(l) # convert a list to an array

>>> print(a)

[[1 2 3]

[3 6 9]

[2 4 6]]

>>> a.shape

(3, 3)

>>> print(a.dtype) # get type of an array

int32

>>> print(a[0]) # this is just like a list of lists

[1 2 3]

>>> print(a[1, 2]) # arrays can be given comma separated indices

9

>>> print(a[1, 1:3]) # and slices

[6 9]

>>> print(a[:,1])

[2 6 4]

Page 8: Python Crash Course Numpy 3 rd year Bachelors V1.0 dd 04-09-2013 Hour 5.

Numpy – array creation and useNumpy – array creation and use

>>> a[1, 2] = 7

>>> print(a)

[[1 2 3]

[3 6 7]

[2 4 6]]

>>> a[:, 0] = [0, 9, 8]

>>> print(a)

[[0 2 3]

[9 6 7]

[8 4 6]]

>>> b = numpy.zeros(5)

>>> print(b)

[ 0. 0. 0. 0. 0.]

>>> b.dtype

dtype(‘float64’)

>>> n = 1000

>>> my_int_array = numpy.zeros(n, dtype=numpy.int)

>>> my_int_array.dtype

dtype(‘int32’)

Page 9: Python Crash Course Numpy 3 rd year Bachelors V1.0 dd 04-09-2013 Hour 5.

Numpy – array creation and useNumpy – array creation and use

>>> c = numpy.ones(4)

>>> print(c)

[ 1. 1. 1. 1. ]

>>> d = numpy.arange(5) # just like range()

>>> print(d)

[0 1 2 3 4]

>>> d[1] = 9.7

>>> print(d) # arrays keep their type even if elements changed

[0 9 2 3 4]

>>> print(d*0.4) # operations create a new array, with new type

[ 0. 3.6 0.8 1.2 1.6]

>>> d = numpy.arange(5, dtype=numpy.float)

>>> print(d)

[ 0. 1. 2. 3. 4.]

>>> numpy.arange(3, 7, 0.5) # arbitrary start, stop and step

array([ 3. , 3.5, 4. , 4.5, 5. , 5.5, 6. , 6.5])

Page 10: Python Crash Course Numpy 3 rd year Bachelors V1.0 dd 04-09-2013 Hour 5.

Numpy – array creation and useNumpy – array creation and use

>>> x = np.array([1,2,3,4])

>>> y = x

>>> x is y

True

>>> x[0] = 9

>>> y

array([9, 2, 3, 4])

>>> x[0] = 1

>>> z = x[:]

>>> x is z

False

>>> x[0] = 8

>>> z

array([8, 2, 3, 4])

Two ndarrays may be views to the same memory:

>>> x = np.array([1,2,3,4])

>>> y = x.copy()

>>> x is y

False

>>> x[0] = 9

>>> y

array([1, 2, 3, 4])

Page 11: Python Crash Course Numpy 3 rd year Bachelors V1.0 dd 04-09-2013 Hour 5.

Numpy – array creation and useNumpy – array creation and use

>>> a = numpy.arange(4.0)

>>> b = a * 23.4

>>> c = b/(a+1)

>>> c += 10

>>> print c

[ 10. 21.7 25.6 27.55]

>>> arr = numpy.arange(100, 200)

>>> select = [5, 25, 50, 75, -5]

>>> print(arr[select]) # can use integer lists as indices

[105, 125, 150, 175, 195]

>>> arr = numpy.arange(10, 20 )

>>> div_by_3 = arr%3 == 0 # comparison produces boolean array

>>> print(div_by_3)

[ False False True False False True False False True False]

>>> print(arr[div_by_3]) # can use boolean lists as indices

[12 15 18]

>>> arr = numpy.arange(10, 20 ) . reshape((2,5))

[[10 11 12 13 14]

[15 16 17 18 19]]

Page 12: Python Crash Course Numpy 3 rd year Bachelors V1.0 dd 04-09-2013 Hour 5.

Numpy – array methodsNumpy – array methods

>>> arr.sum()

45

>>> arr.mean()

4.5

>>> arr.std()

2.8722813232690143

>>> arr.max()

9

>>> arr.min()

0

>>> div_by_3.all()

False

>>> div_by_3.any()

True

>>> div_by_3.sum()

3

>>> div_by_3.nonzero()

(array([2, 5, 8]),)

Page 13: Python Crash Course Numpy 3 rd year Bachelors V1.0 dd 04-09-2013 Hour 5.

Numpy – array mathematicsNumpy – array mathematics

>>> a = np.array([1,2,3], float) >>> b = np.array([5,2,6], float) >>> a + b array([6., 4., 9.]) >>> a – b array([-4., 0., -3.]) >>> a * b array([5., 4., 18.]) >>> b / a array([5., 1., 2.]) >>> a % b array([1., 0., 3.]) >>> b**a array([5., 4., 216.])

>>> a = np.array([[1, 2], [3, 4], [5, 6]], float) >>> b = np.array([-1, 3], float) >>> a array([[ 1., 2.], [ 3., 4.], [ 5., 6.]]) >>> b array([-1., 3.]) >>> a + b array([[ 0., 5.], [ 2., 7.], [ 4., 9.]])

Page 14: Python Crash Course Numpy 3 rd year Bachelors V1.0 dd 04-09-2013 Hour 5.

Numpy – array methods - sortingNumpy – array methods - sorting

>>> arr = numpy.array([4.5, 2.3, 6.7, 1.2, 1.8, 5.5])

>>> arr.sort() # acts on array itself

>>> print(arr)

[ 1.2 1.8 2.3 4.5 5.5 6.7]

>>> x = numpy.array([4.5, 2.3, 6.7, 1.2, 1.8, 5.5])

>>> numpy.sort(x)

array([ 1.2, 1.8, 2.3, 4.5, 5.5, 6.7])

>>> print(x)

[ 4.5 2.3 6.7 1.2 1.8 5.5]

>>> s = x.argsort()

>>> s

array([3, 4, 1, 0, 5, 2])

>>> x[s]

array([ 1.2, 1.8, 2.3, 4.5, 5.5, 6.7])

>>> y[s]

array([ 6.2, 7.8, 2.3, 1.5, 8.5, 4.7])

Page 15: Python Crash Course Numpy 3 rd year Bachelors V1.0 dd 04-09-2013 Hour 5.

Numpy – array functionsNumpy – array functions

• Most array methods have equivalent functions

• Ufuncs provide many element-by-element math, trig., etc. operations– e.g., add(x1, x2), absolute(x), log10(x), sin(x), logical_and(x1, x2)

• See http://numpy.scipy.org

>>> arr.sum() 45 >>> numpy.sum(arr) 45

Page 16: Python Crash Course Numpy 3 rd year Bachelors V1.0 dd 04-09-2013 Hour 5.

Numpy – array operationsNumpy – array operations

>>> a = array([[1.0, 2.0], [4.0, 3.0]]) >>> print a [[ 1. 2.] [ 3. 4.]]

>>> a.transpose() array([[ 1., 3.], [ 2., 4.]])

>>> inv(a) array([[-2. , 1. ], [ 1.5, -0.5]])

>>> u = eye(2) # unit 2x2 matrix; "eye" represents "I"

>>> u array([[ 1., 0.], [ 0., 1.]])

>>> j = array([[0.0, -1.0], [1.0, 0.0]])

>>> dot (j, j) # matrix product array([[-1., 0.], [ 0., -1.]])

Page 17: Python Crash Course Numpy 3 rd year Bachelors V1.0 dd 04-09-2013 Hour 5.

Numpy – statisticsNumpy – statistics

>>> a = np.array([1, 4, 3, 8, 9, 2, 3], float) >>> np.median(a) 3.0

>>> a = np.array([[1, 2, 1, 3], [5, 3, 1, 8]], float) >>> c = np.corrcoef(a) >>> c array([[ 1. , 0.72870505], [ 0.72870505, 1. ]])

>>> np.cov(a) array([[ 0.91666667, 2.08333333], [ 2.08333333, 8.91666667]])

In addition to the mean, var, and std functions, NumPy supplies several other methods for returning statistical features of arrays. The median can be found:

The correlation coefficient for multiple variables observed at multiple instances can be found for arrays of the form [[x1, x2, …], [y1, y2, …], [z1, z2, …], …] where x, y, z are different observables and the numbers indicate the observation times:

Here the return array c[i,j] gives the correlation coefficient for the ith and jth observables. Similarly, the covariance for data can be found::

Page 18: Python Crash Course Numpy 3 rd year Bachelors V1.0 dd 04-09-2013 Hour 5.

Using arrays wiselyUsing arrays wisely

• Array operations are implemented in C or Fortran

• Optimised algorithms - i.e. fast!

• Python loops (i.e. for i in a:…) are much slower

• Prefer array operations over loops, especially when

speed important

• Also produces shorter code, often more readable

Page 19: Python Crash Course Numpy 3 rd year Bachelors V1.0 dd 04-09-2013 Hour 5.

Numpy – arrays, matricesNumpy – arrays, matrices

>>> import numpy

>>> m = numpy.mat([[1,2],[3,4]])

or

>>> a = numpy.array([[1,2],[3,4]])

>>> m = numpy.mat(a)

or

>>> a = numpy.array([[1,2],[3,4]])

>>> m = numpy.asmatrix(a)

For two dimensional arrays NumPy defined a special matrix class in module matrix. Objects are created either with matrix() or mat() or converted from an array with method asmatrix().

Note that the statement m = mat(a) creates a copy of array 'a'. Changing values in 'a' will not affect 'm'. On the other hand, method m = asmatrix(a) returns a new reference to the same data. Changing values in 'a' will affect matrix 'm'.

Page 20: Python Crash Course Numpy 3 rd year Bachelors V1.0 dd 04-09-2013 Hour 5.

Numpy – matricesNumpy – matrices

>>> a = array([[1,2],[3,4]])

>>> m = mat(a) # convert 2-d array to matrix

>>> m = matrix([[1, 2], [3, 4]])

>>> a[0] # result is 1-dimensional

array([1, 2])

>>> m[0] # result is 2-dimensional

matrix([[1, 2]])

>>> a*a # element-by-element multiplication

array([[ 1, 4], [ 9, 16]])

>>> m*m # (algebraic) matrix multiplication

matrix([[ 7, 10], [15, 22]])

>>> a**3 # element-wise power

array([[ 1, 8], [27, 64]])

>>> m**3 # matrix multiplication m*m*m

matrix([[ 37, 54], [ 81, 118]])

>>> m.T # transpose of the matrix

matrix([[1, 3], [2, 4]])

>>> m.H # conjugate transpose (differs from .T for complex matrices)

matrix([[1, 3], [2, 4]])

>>> m.I # inverse matrix

matrix([[-2. , 1. ], [ 1.5, -0.5]])

Array and matrix operations may be quite different!

Page 21: Python Crash Course Numpy 3 rd year Bachelors V1.0 dd 04-09-2013 Hour 5.

Numpy – matricesNumpy – matrices

• Operator *, dot(), and multiply(): • For array, '*' means element-wise multiplication, and the dot() function is used for

matrix multiplication.• For matrix, '*'means matrix multiplication, and the multiply() function is used for

element-wise multiplication. • Handling of vectors (rank-1 arrays)

• For array, the vector shapes 1xN, Nx1, and N are all different things. Operations like A[:,1] return a rank-1 array of shape N, not a rank-2 of shape Nx1. Transpose on a rank-1 array does nothing.

• For matrix, rank-1 arrays are always upgraded to 1xN or Nx1 matrices (row or column vectors). A[:,1] returns a rank-2 matrix of shape Nx1.

• Handling of higher-rank arrays (rank > 2) • array objects can have rank > 2.• matrix objects always have exactly rank 2.

• Convenience attributes • array has a .T attribute, which returns the transpose of the data.• matrix also has .H, .I, and .A attributes, which return the conjugate transpose, inverse, and

asarray() of the matrix, respectively. • Convenience constructor

• The array constructor takes (nested) Python sequences as initializers. As inarray([[1,2,3],[4,5,6]]).

• The matrix constructor additionally takes a convenient string initializer. As inmatrix("[1 2 3; 4 5 6]")

Page 22: Python Crash Course Numpy 3 rd year Bachelors V1.0 dd 04-09-2013 Hour 5.

Introduction to languageIntroduction to language

End