PowerPoint Presentation
Recitation 7
Programming for Engineers in Python1PlanPlottingDebugging The Code22
Plotting - Example3
3Plotting4To install matplotlib package, just click matplotlib download
Simple exampleimport matplotlib.pyplot as plt # shorten the modules nameplt.plot([1,2,3,4]) plt.ylabel(some numbers') plt.show(False) # False is required when calling show from the shell
A list represents a vector!A single input list = y valuesx vector - from 0
4Plotting5Create square numbersplt.plot([1,4,9,16])
Choose correct x values two lists!plt.plot([1,2,3,4], [1,4,9,16], ro)
Fix ranges of axesplt.axis([0, 6, 0, 20])Order: [xmin, xmax, ymin, ymax]
5Line Styles6
The entire description6Plot Continuous Values7Show cos(x) of x values 0-5, with 0.1 step size.How is this range created?>>> range(0, 5, 0.1)TypeError: range() integer step argument expected, got float.
Use numpy!import numpy as np x = np.arange(0, 5, 0.1)
7Numpy Arrays - Creation8>>> A= np.array([[1, 2, 4, 8], [16, 32, 64, 128]]) # 2x4 matrixarray([[1, 2, 4, 8], [16, 32, 64, 128]])>>> B= np.arange(8).reshape(2, 4) # reshaped into 2x4 matrixarray([[0, 1, 2, 3], [4, 5, 6, 7]])>>> np.zeros((2, 4)) # create a 2x4 matrix of zerosarray([[0., 0., 0., 0.], [0., 0., 0., 0.]])8Numpy Arrays9>>> np.ones((2, 4)) # create a 2x4 matrix of onesarray([[1., 1., 1., 1.], [1., 1., 1., 1.]])>>> A B # elementwise subtractionarray([[1, 1, 2, 5], [12, 27, 58, 121]])>>> B**2array([[0, 1, 4, 9], [16, 25, 36, 49])
9Numpy Arrays - Arithmatics10>>> A*B # elementwise product array([[ 0, 2, 8, 24], [ 64, 160, 384, 896]])>>> np.dot(A, np.transpose(B)) # dot product, dims must agreearray([[ 34, 94], [ 544, 1504]])>>> B.cumsum(axis=1) # cumulative sum along each row array([[ 0, 1, 3, 6], [ 4, 9, 15, 22]])
10Plot Continuous Values11Left plt.plot(x, np.cos(2*np.pi*x), 'r--')Right x1 = np.arange(0, 10, 0.1)x2 = np.arange(0, 10)plt.plot(x1, np.exp(x1), 'b-', x2, np.exp(x2), 'ro')
11Explaining the Data12How can I know what a plot refers to?plt.xlabel(radians)plt.ylabel(cosine)plt.title(Cosine Function)
12Subplots13
13Subplots14subplot(numRows, numCols, plotNum)>>> subplot(3, 2, 4)Lose the commas if rows and cols < 10
plt.subplot(211)plt.plot(x, np.cos(2*np.pi*x), 'r--')plt.subplot(212)x1 = np.arange(0, 10, 0.1)x2= np.arange(0, 10)plt.plot(x1, np.exp(x), 'b-', x2, np.exp(x2), 'ro')
Plot 1Plot 2Plot 3Plot 4Plot 5Plot 614Show Histograms15# create datamu = 100sigma = 15x = mu + sigma * np.random.randn(10000)# the histogram of the dataplt.hist(x, 50, normed = 1, facecolor='g')# arrange plotplt.xlabel('Smarts')plt.ylabel('Probability')plt.title('Histogram of IQ')plt.axis([40, 160, 0, 0.03])
15Show Histograms16
16 Estimation17Rings a bell? (recitation 4)def estimate_pi(error): term = 1 summ = 0 k = 1 while term > error: term = 1.0/k**2 summ += term k += 1 summ = sqrt(summ*6.0)
return summ17 Estimation18Create estimations of by different error valuespi_est = []err_val = range(2, 12)err_vec = [10**(-x) for x in err_val]for err in err_vec: pi_est.append(estimate_pi(err))
18 Estimation Build Plot19margin = 0.01plt.plot([err_val[0]-1, err_val[-1]+1],[pi, pi], 'b-', err_val, pi_est, 'go')plt.axis([err_val[0]-1, err_val[-1]+1, min(pi_est)- margin, max(pi_est)+ margin ])
# document plotplt.xlabel('-log10 error')plt.ylabel('Estimation')plt.title('Pi Estimation')plt.legend(('python pi','estimation'), loc=4)# show plot and save as an imageplt.show()plt.savefig('pi.png')
19 Estimation - Result20
20How to Find Bugs21We refer to semantic (not syntactic) bugs
General Scheme:ThinkInvestigate variables through the interactive mode (shell)OrAdd print statements inside functions
Tip: reduce the problem - fewer loop iterations, toy data structures, isolate parts of the code etc.Runs faster, helps tracing problems.
2122A unit is the smallest testable part of an application.The goal of unit testing is to isolate each part of the program and show that the individual parts are correctPros: simplifies integration with other units, living documentation (how to use the code), helps design.The hw tests are examples of unit testing
How to Find Bugs
22How to Find Bugs23Mission: create 1000 lists of 25 guesses (random numbers) from 0,1,2,3nSuits, nCards, nPlayers = 4, 25, 1000players_guess=[]cards_list=[0]*nCards# create guessesfor player in range(nPlayers): for card in range(nCards): # create one guess cards_list[card ]= random.randrange(0,nSuits) players_guess.append(cards_list)
23How to Find Bugs24Investigate the lists created:>>> players_guess[0][1, 1, 3, 3, 2, 2, 2, 3, 1, 2, 3, 1, 3, 0, 0, 3, 2, 0, 2, 0, 3, 2, 2, 3, 2]>>> players_guess[1][1, 1, 3, 3, 2, 2, 2, 3, 1, 2, 3, 1, 3, 0, 0, 3, 2, 0, 2, 0, 3, 2, 2, 3, 2]>>> players_guess[2][1, 1, 3, 3, 2, 2, 2, 3, 1, 2, 3, 1, 3, 0, 0, 3, 2, 0, 2, 0, 3, 2, 2, 3, 2]Oh, No, Bug!
How to Find Bugs
2425Trace the code step by step. In this case by iterations. We begin by tracing the outer loop:for player in range(3): # 1000 is a lot! for card in range(nCards): cards_list[card ]= random.randrange(0,nSuits) players_guess.append(cards_list) print cards_list
How to Find Bugs
2526Output:[2, 3, 3, 0, 2, 1, 2, 0, 2, 3, 2, 2, 2, 1, 1, 0, 0, 2, 2, 1, 2, 3, 0, 0, 3][1, 2, 3, 3, 2, 0, 0, 1, 0, 0, 1, 2, 2, 3, 3, 1, 2, 1, 0, 0, 2, 0, 1, 3, 3][2, 2, 2, 0, 3, 1, 3, 2, 1, 2, 3, 1, 2, 3, 1, 2, 1, 1, 0, 1, 2, 2, 0, 2, 1]The problem is not here.What is players_guess? >>> players_guess[[2, 2, 2, 0, 3, 1, 3, 2, 1, 2, 3, 1, 2, 3, 1, 2, 1, 1, 0, 1, 2, 2, 0, 2, 1], [2, 2, 2, 0, 3, 1, 3, 2, 1, 2, 3, 1, 2, 3, 1, 2, 1, 1, 0, 1, 2, 2, 0, 2, 1], [2, 2, 2, 0, 3, 1, 3, 2, 1, 2, 3, 1, 2, 3, 1, 2, 1, 1, 0, 1, 2, 2, 0, 2, 1]]Notice anything?How to Find Bugs
2627Ok, we found the problem, but what is the reason? And the solution?Main suspect: players_guess.append(cards_list)Is this drawing correct?
How to Find Bugs
players_guesscards_listcards_listcards_list2728There is only one list which is mutated every iteration.Found the problem.Solution?players_guesscards_listcards_listcards_listHow to Find Bugs
2829for player in range(nPlayers): # create cards list inside the loop cards_list=[0]*nCards for card in range(nCards): cards_list[card]= random.randrange(0,nSuits) players_guess.append(cards_list)How to Find Bugs
2930Mission: replace first and last character in a stringdef switch(s):first = s [0]last = s [-1]s = s.replace(s[0], last )s = s.replace(s[-1], first )return s>>> switch(abcd)abca>>> switch(banana)bbnbnb
How to Find Bugs
3031Add printdef switch(s):first = s [0]last = s [-1]s = s.replace(s[0], last )s = s.replace(s[-1], first )return s
How to Find Bugs
3132>>> switch('abcd')'abca'>>> switch('banana')'bbnbnb
Lets add print commands inside switch:print ss = s.replace(s[0], last )print ss = s.replace(s[-1], first )return s
How to Find Bugs
3233>>> switch('abcd')abcddbcd'abca'>>> switch('banana')bananaaanana'bbnbnbObservations?How to Find Bugs
3334Observation:replace changes all occurances of the character in the string we only want one specific change.>>> help(str.replace)replace(...) S.replace(old, new[, count]) -> string Solution:s = s.replace(s[0], last, 1 )s = s.replace(s[-1], first, 1 )
How to Find Bugs
3435>>> switch('abcd')abcddbcd'abcd'>>> switch('banana')bananaaanana'bananaObservation: The first letter is changed twice!Solution: replace doesnt work for us, use a different method!How to Find Bugs
3536New code:return s[-1]+s[1:-1]+s[0]
>>> switch('abcd')'dbca'>>> switch('banana')'aananbHow to Find Bugs
3637class Nothing:def set_value(self, value): self.value = valuedef print_value(value): print value
not_a_thing = Nothing()not_a_thing.set_value(nowhere)not_a_thing.print_value()>>> ???How to Find Bugs
37
Top Related