Σε αυτό το παράδειγμα, θα μάθουμε να πολλαπλασιάζουμε τους πίνακες χρησιμοποιώντας δύο διαφορετικούς τρόπους: ένθετο βρόχο και, ένθετη λίστα
Για να κατανοήσετε αυτό το παράδειγμα, θα πρέπει να γνωρίζετε τις ακόλουθες θεματολογίες προγραμματισμού Python:
- Python για βρόχο
- Λίστα Python
- Πίνακες Python και πίνακες NumPy
Στο Python, μπορούμε να εφαρμόσουμε έναν πίνακα ως ένθετη λίστα (λίστα μέσα σε μια λίστα).
Μπορούμε να αντιμετωπίσουμε κάθε στοιχείο ως μια σειρά του πίνακα.
Για παράδειγμα, X = ((1, 2), (4, 5), (3, 6))
θα παριστάνει μια 3x2
μήτρα.
Η πρώτη σειρά μπορεί να επιλεγεί ως X(0)
. Και, το στοιχείο στην πρώτη σειρά, πρώτη στήλη μπορεί να επιλεγεί ως X(0)(0)
.
Ο πολλαπλασιασμός δύο πινάκων Χ και Υ ορίζεται μόνο εάν ο αριθμός των στηλών στο Χ είναι ίσος με τον αριθμό των γραμμών Υ.
Εάν το Χ είναι ένας n x m
πίνακας και το Υ είναι ένας m x l
πίνακας τότε, το XY ορίζεται και έχει τη διάσταση n x l
(αλλά το YX δεν ορίζεται). Εδώ είναι μερικοί τρόποι για την εφαρμογή πολλαπλασιασμού μήτρας στο Python.
Πηγαίος κώδικας: Πολλαπλασιασμός Matrix χρησιμοποιώντας Nested Loop
# Program to multiply two matrices using nested loops # 3x3 matrix X = ((12,7,3), (4 ,5,6), (7 ,8,9)) # 3x4 matrix Y = ((5,8,1,2), (6,7,3,0), (4,5,9,1)) # result is 3x4 result = ((0,0,0,0), (0,0,0,0), (0,0,0,0)) # iterate through rows of X for i in range(len(X)): # iterate through columns of Y for j in range(len(Y(0))): # iterate through rows of Y for k in range(len(Y)): result(i)(j) += X(i)(k) * Y(k)(j) for r in result: print(r)
Παραγωγή
(114, 160, 60, 27) (74, 97, 73, 14) (119, 157, 112, 23)
Σε αυτό το πρόγραμμα, χρησιμοποιήσαμε ένθετους for
βρόχους για να επαναλάβουμε κάθε σειρά και κάθε στήλη. Συγκεντρώνουμε το άθροισμα των προϊόντων στο αποτέλεσμα.
Αυτή η τεχνική είναι απλή αλλά υπολογιστικά ακριβή καθώς αυξάνουμε τη σειρά του πίνακα.
Για μεγαλύτερες λειτουργίες matrix, προτείνουμε βελτιστοποιημένα πακέτα λογισμικού όπως το NumPy, το οποίο είναι αρκετά (της τάξης των 1000) φορές πιο γρήγορα από τον παραπάνω κώδικα.
Πηγαίος κώδικας: Πολλαπλασιασμός μήτρας με χρήση κατανόησης ένθετων λιστών
# Program to multiply two matrices using list comprehension # 3x3 matrix X = ((12,7,3), (4 ,5,6), (7 ,8,9)) # 3x4 matrix Y = ((5,8,1,2), (6,7,3,0), (4,5,9,1)) # result is 3x4 result = ((sum(a*b for a,b in zip(X_row,Y_col)) for Y_col in zip(*Y)) for X_row in X) for r in result: print(r)
Η έξοδος αυτού του προγράμματος είναι η ίδια όπως παραπάνω. Για να κατανοήσουμε τον παραπάνω κώδικα, πρέπει πρώτα να γνωρίζουμε για την ενσωματωμένη λειτουργία zip()
και την αποσυσκευασία της λίστας ορίσματος χρησιμοποιώντας τον τελεστή *.
Έχουμε χρησιμοποιήσει την κατανόηση της ένθετης λίστας για να επαναλάβουμε κάθε στοιχείο του πίνακα. Ο κώδικας φαίνεται περίπλοκος και δυσανάγνωστος στην αρχή. Αλλά μόλις καταλάβετε το περιεχόμενο των λιστών, πιθανότατα δεν θα επιστρέψετε σε ένθετους βρόχους.