Recitation 7 Programming for Engineers in Python.

Click here to load reader

download Recitation 7 Programming for Engineers in Python.

of 37

  • date post

    19-Dec-2015
  • Category

    Documents

  • view

    226
  • download

    0

Transcript of Recitation 7 Programming for Engineers in Python.

  • Slide 1
  • Recitation 7 Programming for Engineers in Python
  • Slide 2
  • Plan Plotting Debugging The Code 2
  • Slide 3
  • Plotting - Example 3
  • Slide 4
  • Plotting 4 To install matplotlib package, just click matplotlib downloadmatplotlib download Simple example import matplotlib.pyplot as plt # shorten the modules name plt.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 values x vector - from 0
  • Slide 5
  • Plotting 5 Create square numbers plt.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 axes plt.axis([0, 6, 0, 20]) Order: [xmin, xmax, ymin, ymax]
  • Slide 6
  • Line Styles 6 The entire description
  • Slide 7
  • Plot Continuous Values 7 Show 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)
  • Slide 8
  • Numpy Arrays - Creation 8 >>> A= np.array([[1, 2, 4, 8], [16, 32, 64, 128]]) # 2x4 matrix array([[1, 2, 4, 8], [16, 32, 64, 128]]) >>> B= np.arange(8).reshape(2, 4) # reshaped into 2x4 matrix array([[0, 1, 2, 3], [4, 5, 6, 7]]) >>> np.zeros((2, 4)) # create a 2x4 matrix of zeros array([[0., 0., 0., 0.], [0., 0., 0., 0.]])
  • Slide 9
  • Numpy Arrays 9 >>> np.ones((2, 4)) # create a 2x4 matrix of ones array([[1., 1., 1., 1.], [1., 1., 1., 1.]]) >>> A B # elementwise subtraction array([[1, 1, 2, 5], [12, 27, 58, 121]]) >>> B**2 array([[0, 1, 4, 9], [16, 25, 36, 49])
  • Slide 10
  • Numpy Arrays - Arithmatics 10 >>> A*B # elementwise product array([[ 0, 2, 8, 24], [ 64, 160, 384, 896]]) >>> np.dot(A, np.transpose(B)) # dot product, dims must agree array([[ 34, 94], [ 544, 1504]]) >>> B.cumsum(axis=1) # cumulative sum along each row array([[ 0, 1, 3, 6], [ 4, 9, 15, 22]])
  • Slide 11
  • Plot Continuous Values 11 Left 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')
  • Slide 12
  • Explaining the Data 12 How can I know what a plot refers to? plt.xlabel(radians) plt.ylabel(cosine) plt.title(Cosine Function)
  • Slide 13
  • Subplots 13
  • Slide 14
  • Subplots 14 subplot(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 2 Plot 3Plot 4 Plot 5Plot 6
  • Slide 15
  • Show Histograms 15 # create data mu = 100 sigma = 15 x = mu + sigma * np.random.randn(10000) # the histogram of the data plt.hist(x, 50, normed = 1, facecolor='g') # arrange plot plt.xlabel('Smarts') plt.ylabel('Probability') plt.title('Histogram of IQ') plt.axis([40, 160, 0, 0.03])
  • Slide 16
  • Show Histograms 16
  • Slide 17
  • Estimation 17 Rings 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 summ
  • Slide 18
  • Estimation 18 Create estimations of by different error values pi_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))
  • Slide 19
  • Estimation Build Plot 19 margin = 0.01 plt.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 plot plt.xlabel('-log10 error') plt.ylabel('Estimation') plt.title('Pi Estimation') plt.legend(('python pi','estimation'), loc=4) # show plot and save as an image plt.show() plt.savefig('pi.png')
  • Slide 20
  • Estimation - Result 20
  • Slide 21
  • How to Find Bugs 21
  • Slide 22
  • 22 A 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 correct Pros: 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
  • Slide 23
  • 23 Mission: create 1000 lists of 25 guesses (random numbers) from 0,1,2,3 nSuits, nCards, nPlayers = 4, 25, 1000 players_guess=[] cards_list=[0]*nCards # create guesses for player in range(nPlayers): for card in range(nCards): # create one guess cards_list[card ]= random.randrange(0,nSuits) players_guess.append(cards_list)
  • Slide 24
  • How to Find Bugs 24 Investigate 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
  • Slide 25
  • 25 Trace 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
  • Slide 26
  • 26 Output: [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
  • Slide 27
  • 27 Ok, 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_guess cards_list
  • Slide 28
  • 28 There is only one list which is mutated every iteration. Found the problem. Solution? players_guess cards_list How to Find Bugs
  • Slide 29
  • 29 for 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
  • Slide 30
  • 30 Mission: replace first and last character in a string def 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
  • Slide 31
  • 31 Add print def 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
  • Slide 32
  • 32 >>> switch('abcd') 'abca' >>> switch('banana') 'bbnbnb Lets add print commands inside switch: print s s = s.replace(s[0], last ) print s s = s.replace(s[-1], first ) return s How to Find Bugs
  • Slide 33
  • 33 >>> switch('abcd') abcd dbcd 'abca' >>> switch('banana') banana aanana 'bbnbnb Observations? How to Find Bugs
  • Slide 34
  • 34 Observation: 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
  • Slide 35
  • 35 >>> switch('abcd') abcd dbcd 'abcd' >>> switch('banana') banana aanana 'banana Observation: The first letter is changed twice! Solution: replace doesnt work for us, use a different method! How to Find Bugs
  • Slide 36
  • 36 New code: return s[-1]+s[1:-1]+s[0] >>> switch('abcd') 'dbca' >>> switch('banana') 'aananb How to Find Bugs
  • Slide 37
  • 37 class Nothing: def set_value(self, value): self.value = value def print_value(value): print value not_a_thing = Nothing() not_a_thing.set_value(nowhere) not_a_thing.print_value() >>> ??? How to Find Bugs