Θεωρία Πληροφορίας - Κώδικες Γιαννακόπουλος Θεόδωρος 1
Θεωρία Πληροφορίας - Κώδικες Εργαστήριο 2 Numpy, matplotlib και παραδείγματα 2
Numpy (1) - Γενικά - numpy: numerical python - η βασική βιβλιοθήκη για επιστημονικό υπολογισμό - γρήγορη και εύκολη διαχείριση πολυδιάστατων πινάκων - γραμμική άλγεβρα - ομοιότητα με matlab στην σύνταξη a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) print a.shape # prints (3,) print a+b # prints [5 7 9] a[0] = 0 print a # prints [0 2 3] 3
Numpy (2) - Ορισμοί και Βασικές Πράξεις a = np.zeros((2,2)) print a.shape # prints (2, 2) print a # prints [[ 0. 0.] [ 0. 0.]] print a + 2 # prints [[ 2. 2.] [ 2. 2.]] b = np.random.random((3,2)) # create a 3x2 random matrix a = np.array([[1,2,3],[4,5,6]]) b = np.array([[1,1,1],[2,2,2]]) print a + b # prints [[2 3 4] [6 7 8]] print a * b # prints [[ 1 2 3] [ 8 10 12]] np.dot(a,b) # ValueError: objects are not aligned print np.sum(a) # prints 21 print np.sum(a, axis = 0) # prints [5 7 9] print np.sum(a, axis = 1) # prints [6 15] print (a.t).shape # prints (3,2) prints (a.t) # pritns [[1 4] [2 5] [3 6]] 4
Numpy (3) - Indexing (1) a = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]]) b = a[:2, 1:3] slices (2 πρωτες γραμμές + 2η,3η στήλη) print a[0, 1] # Prints "2" b[0, 0] = 77 # b[0, 0] is the same piece of data as a[0, 1] print a[0, 1] # Prints "77"!!! αλλάζοντας το b αλλάζει και το a 5
Numpy (3) - Indexing (2) a = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]]) row_r1 = a[1, :] # Rank 1 view of the second row of a row_r2 = a[1:2, :] # Rank 2 view of the second row of a print row_r1, row_r1.shape # Prints "[5 6 7 8] (4,)" print row_r2, row_r2.shape # Prints "[[5 6 7 8]] (1, 4)" Υπάρχουν 2 τρόποι προσπέλασης γραμμών ή στηλών - ακέραιος + slice 1-d διάνυσμα - slice + slice 2-d πίνακας col_r1 = a[:, 1] col_r2 = a[:, 1:2] print col_r1, col_r1.shape # Prints "[ 2 6 10] (3,)" print col_r2, col_r2.shape # Prints "[[ 2] # [ 6] # [10]] (3, 1)" 6
Numpy (3) - Indexing (3) a = np.array([[1,2], [3, 4], [5, 6]]) print a[[0, 1, 2], [0, 1, 0]] # Prints "[1 4 5]" # equivalent: print np.array([a[0, 0], a[1, 1], a[2, 0]]) # Prints "[1 4 5]" - το slicing οδηγεί σε υποπίνακες - αν χρησιμοποιηθούν ακέραιοι στο indexing μπορούν να προκύψουν πιο αυθαίρετοι (arbitary) πίνακες print a[[0, 0], [1, 1]] # Prints "[2 2]" # equivalent: print np.array([a[0, 1], a[0, 1]]) # Prints "[2 2]" Στο indexing μέσω ακεραίων μπορούν κάποια στοιχεία του πίνακα να επαναχρησιμοποιηθούν (εδώ το (0,1)) 7
Numpy (4) - Indexing (4) - indexing μέσω boolean: για έλεγχο συνθηκών a = np.array([[1,2], [3, 4], [5, 6]]) bool_idx = (a > 2) print bool_idx # Prints "[[False False] # [ True True] # [ True True]]" print a[bool_idx] # Prints "[3 4 5 6]" # equivalent print a[a > 2] # Prints "[3 4 5 6]" Επιστρέφει ένα numpy array με booleans που έχει: - ίδιο μέγεθος με το αρχικό - True/False αν το αντίστοιχο στοιχείο ικανοποιεί (δεν) την συνθήκη >2 ένα array που αποτελείται από τα στοιχεία του a για τα οποία το bool_idx ειναι true όλα τα παραπάνω μπορούν να γίνουν και σε ένα βήμα 8
Numpy (4) - Broadcasting (1) broadcasting: μηχανισμός που επιτρέπει να χειριζόμαστε πίνακες διαφορετικών μεγεθών για να πραγματοποιούμε αριθμητικές πράξεις x = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]]) v = np.array([1, 0, 1]) y = np.empty_like(x) for i in range(4): y[i, :] = x[i, :] + v print y x = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]]) v = np.array([1, 0, 1]) vv = np.tile(v, (4, 1)) print vv y = x + vv print y loop: αργό και μή αποδοτικό κενός πίνακας ίδιου μεγέθους με τον x πρόσθεσε το v σε κάθε γραμμή του x (loop) [[ 2 2 4] [ 5 5 7] [ 8 8 10] [11 11 13]] στοιβάζουμε 4 αντίγραφα του v. αποτέλεσμα: [[1 0 1] [1 0 1][1 0 1][1 0 1]] [[ 2 2 4] [ 5 5 7] [ 8 8 10] [11 11 13]] 9
Numpy (4) - Broadcasting (2) broadcasting: μηχανισμός που επιτρέπει να χειριζόμαστε πίνακες διαφορετικών μεγεθών για να πραγματοποιούμε αριθμητικές πράξεις x = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]]) v = np.array([1, 0, 1]) y = x + v print y πρόσθεσε το v σε κάθε γραμμή του x (broadcasting) broadcasting: το y = x + v καταλήγει σε επιτυχία παρόλο που το x έχει μέγεθος (3,2) και το v (3,). (άθροισμα κατά γραμμή) 10
matplotlib (1) - Γενικά - βιβλιοθήκη για παραγωγή γραφικών παραστάσεων σε python - το interface pyplot έχει Matlab-like λειτουργητότητα 11
matplotlib (2) - παράδειγμα plot 1 - plot(y): ενώνει με γραμμικό τρόπο τα σημεία (0,Y(0)), (1, Y(1)) κτλ - plot(x, Y): ενώνει με γραμμικό τρόπο τα σημεία (X(i),Y(i)) import matplotlib.pyplot as plt plt.plot([1, 2, 3, 2, 1]) plt.ylabel('y') plt.show() import matplotlib.pyplot as plt plt.plot([0.1,0.2,0.3,0.4,0.5],[1,2,3,2,1]) plt.ylabel('y') plt.show() 12
matplotlib (2) - παράδειγμα plot 2 import matplotlib.pyplot as plt x = np.arange(-2,2,0.1) y = x ** 2-1 plt.plot(x, y) plt.ylabel('x^2') plt.xlabel('x') plt.show() import matplotlib.pyplot as plt x = np.arange(-2,2,0.1) y = x ** 2-1 plt.plot(x, y, '*') plt.ylabel('x^2') plt.xlabel('x') plt.show() 13
matplotlib (2) - παράδειγμα plot 3 import matplotlib.pyplot as plt Fs = 8000 t = np.arange(0, 0.01, 1.0/Fs) y1 = np.cos(2*np.pi*200*t) y2 = np.cos(2*np.pi*300*t) plt.plot(t, y1, 'r') plt.plot(t, y2, 'g') plt.legend(['cos(2*pi*200*t)','cos(2*pi*300*t)']) plt.xlabel('t (sec)') plt.show() # sampling rate # time values # y1 = 2*pi*200*t # y2 = 2*pi*300*t # plot y1 # plot y2 # show legends 14
matplotlib (3) - παράδειγμα εντροπίας import matplotlib.pyplot as plt p1 = np.arange(0.005,1,0.005) # p1 defined in the [0:0.05:1] range p2 = 1 - p1 # p2 = 1 - p1 H = np.zeros(p1.shape) # entropy initialization for i in range(p1.shape[0]): # for each p value Probs = np.array([p1[i], p2[i]]) # define probabiitlies matrix H[i] = -np.sum(probs * np.log2(probs+0.00000000001))# compute entropy plt.plot(p1, H) plt.xlabel("p1") plt.ylabel("entropy") plt.show() 15