Οδηγός για Arrays στην Python

Οδηγός για Arrays στην Python

Εισαγωγή

Φανταστείτε ότι έχετε μια λίστα αναπαραγωγής με τα αγαπημένα σας τραγούδια στο τηλέφωνό σας. Αυτή η λίστα αναπαραγωγής είναι μια λίστα όπου κάθε τραγούδι τοποθετείται με συγκεκριμένη σειρά. Μπορείτε να παίξετε το πρώτο τραγούδι, να μεταβείτε στο δεύτερο, να μεταβείτε στο πέμπτο και ούτω καθεξής. Αυτή η λίστα αναπαραγωγής μοιάζει πολύ με μια συστοιχία στον προγραμματισμό υπολογιστών.

Οι πίνακες αποτελούν μια από τις πιο θεμελιώδεις και ευρέως χρησιμοποιούμενες δομές δεδομένων.

Ουσιαστικά, ένας πίνακας είναι ένας δομημένος τρόπος αποθήκευσης πολλών στοιχείων (όπως αριθμοί, χαρακτήρες ή ακόμα και άλλοι πίνακες) σε μια συγκεκριμένη σειρά και μπορείτε να έχετε γρήγορη πρόσβαση, να τροποποιήσετε ή να αφαιρέσετε οποιοδήποτε στοιχείο εάν γνωρίζετε τη θέση του (ευρετήριο).

Σε αυτόν τον οδηγό, θα σας δώσουμε μια ολοκληρωμένη επισκόπηση της δομής δεδομένων πίνακα. Πρώτα απ 'όλα, θα ρίξουμε μια ματιά στο τι είναι οι πίνακες και ποια είναι τα κύρια χαρακτηριστικά τους. Στη συνέχεια, θα μεταβούμε στον κόσμο της Python, εξερευνώντας πώς οι πίνακες υλοποιούνται, χειρίζονται και εφαρμόζονται σε σενάρια πραγματικού κόσμου.

Κατανόηση της Δομής Δεδομένων Πίνακα

Οι πίνακες είναι από τις παλαιότερες και πιο θεμελιώδεις δομές δεδομένων που χρησιμοποιούνται στην επιστήμη των υπολογιστών και στον προγραμματισμό. Η απλότητά τους, σε συνδυασμό με την αποτελεσματικότητά τους σε ορισμένες λειτουργίες, τα καθιστά βασικό θέμα για όποιον εμβαθύνει στη σφαίρα της διαχείρισης και χειραγώγησης δεδομένων.

Ένας πίνακας είναι μια συλλογή στοιχείων, συνήθως των ίδιου τύπου, αποθηκευμένο σε συνεχόμενες θέσεις μνήμης.

Αυτή η συνεχόμενη αποθήκευση επιτρέπει σε πίνακες να παρέχουν πρόσβαση σταθερού χρόνου σε οποιοδήποτε στοιχείο, δεδομένου του ευρετηρίου του. Κάθε στοιχείο σε έναν πίνακα ονομάζεται an στοιχείο, και η θέση ενός στοιχείου στον πίνακα ορίζεται από αυτό ευρετήριο, που συνήθως ξεκινά από το μηδέν.

Για παράδειγμα, θεωρήστε έναν πίνακα ακεραίων: [10, 20, 30, 40, 50]. Εδώ, το στοιχείο 20 έχει δείκτη του 1:

ευρετηρίαση πίνακα python

Υπάρχουν πολλά πλεονεκτήματα της χρήσης συστοιχιών για την αποθήκευση των δεδομένων μας. Για παράδειγμα, λόγω της διάταξης μνήμης τους, οι πίνακες επιτρέπουν Ο (1) (σταθερή) χρονική πολυπλοκότητα κατά την πρόσβαση σε ένα στοιχείο από το ευρετήριό του. Αυτό είναι ιδιαίτερα ωφέλιμο όταν χρειαζόμαστε τυχαία πρόσβαση σε στοιχεία. Επιπλέον, οι πίνακες αποθηκεύονται σε συνεχόμενες θέσεις μνήμης, το οποίο μπορεί να οδηγήσει σε καλύτερη τοποθεσία της κρυφής μνήμης και γενικές βελτιώσεις απόδοσης σε ορισμένες λειτουργίες. Ένα άλλο αξιοσημείωτο πλεονέκτημα της χρήσης πινάκων είναι ότι, δεδομένου ότι οι πίνακες έχουν ένα σταθερό μέγεθος αφού δηλωθεί, είναι ευκολότερο να διαχειριστείτε τη μνήμη και να αποφύγετε απροσδόκητες υπερχειλίσεις ή σφάλματα εκτός μνήμης.

Note: Οι πίνακες είναι ιδιαίτερα χρήσιμοι σε σενάρια όπου το Το μέγεθος της συλλογής είναι γνωστό εκ των προτέρων και παραμένει σταθερό, ή όπου η τυχαία πρόσβαση είναι πιο συχνή από τις εισαγωγές και τις διαγραφές.

Από την άλλη πλευρά, οι πίνακες έρχονται με το δικό τους σύνολο περιορισμούς. Ένας από τους κύριους περιορισμούς των παραδοσιακών συστοιχιών είναι ο δικός τους σταθερό μέγεθος. Μόλις δημιουργηθεί ένας πίνακας, το μέγεθός του δεν μπορεί να αλλάξει. Αυτό μπορεί να οδηγήσει σε ζητήματα όπως η σπατάλη μνήμης (αν ο πίνακας είναι πολύ μεγάλος) ή η ανάγκη αλλαγής μεγέθους (αν ο πίνακας είναι πολύ μικρός). Επιπλέον, η εισαγωγή ή η διαγραφή ενός στοιχείου στη μέση ενός πίνακα απαιτεί μετατόπιση στοιχείων, που οδηγεί σε O (n) χρονική πολυπλοκότητα για αυτές τις λειτουργίες.

Για να συνοψίσουμε όλα αυτά, ας επεξηγήσουμε τα κύρια χαρακτηριστικά των συστοιχιών χρησιμοποιώντας το παράδειγμα της λίστας αναπαραγωγής τραγουδιών από την αρχή αυτού του οδηγού. Ένας πίνακας είναι μια δομή δεδομένων που:

  • Είναι ευρετηριασμένο: Όπως κάθε τραγούδι στη λίστα αναπαραγωγής σας έχει έναν αριθμό (1, 2, 3, …), κάθε στοιχείο σε έναν πίνακα έχει ένα ευρετήριο. Όμως, στις περισσότερες γλώσσες προγραμματισμού, το ευρετήριο ξεκινά από το 0. Έτσι, το πρώτο στοιχείο βρίσκεται στο δείκτη 0, το δεύτερο στο ευρετήριο 1 και ούτω καθεξής.

  • Έχει σταθερό μέγεθος: Όταν δημιουργείτε μια λίστα αναπαραγωγής, ας πούμε, για 10 τραγούδια, δεν μπορείτε να προσθέσετε ένα 11ο τραγούδι χωρίς να αφαιρέσετε πρώτα ένα. Ομοίως, οι πίνακες έχουν σταθερό μέγεθος. Μόλις δημιουργήσετε έναν πίνακα συγκεκριμένου μεγέθους, δεν μπορείτε να προσθέσετε περισσότερα στοιχεία από τη χωρητικότητά του.

  • Είναι ομοιογενής: Όλα τα τραγούδια στη λίστα αναπαραγωγής σας είναι μουσικά κομμάτια. Ομοίως, όλα τα στοιχεία σε έναν πίνακα είναι του ίδιου τύπου. Εάν έχετε μια σειρά από ακέραιους αριθμούς, δεν μπορείτε ξαφνικά να αποθηκεύσετε μια συμβολοσειρά κειμένου σε αυτήν.

  • Έχει Άμεση Πρόσβαση: Αν θέλετε να ακούσετε το 7ο τραγούδι στη λίστα αναπαραγωγής σας, μπορείτε να μεταβείτε απευθείας σε αυτό. Ομοίως, με πίνακες, μπορείτε να έχετε άμεση πρόσβαση σε οποιοδήποτε στοιχείο εάν γνωρίζετε το ευρετήριό του.

  • Συνεχής Μνήμη: Αυτό είναι λίγο πιο τεχνικό. Όταν δημιουργείται ένας πίνακας στη μνήμη ενός υπολογιστή, καταλαμβάνει ένα συνεχές μπλοκ μνήμης. Σκεφτείτε το σαν μια σειρά από διπλανά ντουλάπια στο σχολείο. Κάθε ντουλάπι είναι δίπλα στο άλλο, χωρίς κενά ενδιάμεσα.

Python και Arrays

Η Python, γνωστή για την ευελιξία και την ευκολία χρήσης της, προσφέρει πολλούς τρόπους εργασίας με πίνακες. Ενώ η Python δεν έχει μια εγγενή δομή δεδομένων πίνακα όπως ορισμένες άλλες γλώσσες, παρέχει ισχυρές εναλλακτικές λύσεις που μπορούν να λειτουργήσουν παρόμοια και ακόμη και να προσφέρουν εκτεταμένες δυνατότητες.

Με την πρώτη ματιά, Η λίστα της Python μπορεί να φαίνεται συνώνυμο με έναν πίνακα, αλλά υπάρχουν λεπτές διαφορές και αποχρώσεις που πρέπει να λάβετε υπόψη:

Λιστα Παράταξη
Μια ενσωματωμένη δομή δεδομένων Python Δεν είναι εγγενές στην Python – προέρχονται από τη λειτουργική μονάδα «array».
Δυναμικό μέγεθος Σταθερό (προκαθορισμένο) μέγεθος
Μπορεί να κρατήσει στοιχεία διαφορετικών τύπων δεδομένων Κρατήστε αντικείμενα του ίδιου τύπου
Παρέχετε μια σειρά από ενσωματωμένες μεθόδους χειρισμού Ανάγκη εισαγωγής εξωτερικών μονάδων
O(1) πολυπλοκότητα χρόνου για λειτουργίες πρόσβασης O(1) πολυπλοκότητα χρόνου για λειτουργίες πρόσβασης
Καταναλώστε περισσότερη μνήμη Πιο αποδοτική μνήμη

Κοιτάζοντας αυτόν τον πίνακα, είναι φυσικό να ρωτήσω – «Πότε να χρησιμοποιήσω ποιο;». Λοιπόν, εάν χρειάζεστε μια συλλογή που μπορεί να αναπτυχθεί ή να συρρικνωθεί δυναμικά και να μπορεί να χωρέσει μεικτούς τύπους δεδομένων, η λίστα της Python είναι ο καλύτερος τρόπος. Ωστόσο, για σενάρια που απαιτούν συλλογή πιο αποδοτικής μνήμης με στοιχεία του ίδιου τύπου, μπορείτε να εξετάσετε το ενδεχόμενο να χρησιμοποιήσετε το Python's array module ή εξωτερικές βιβλιοθήκες όπως το NumPy.

Η παράταξη Ενότητα σε Python

Όταν οι περισσότεροι προγραμματιστές σκέφτονται πίνακες στην Python, συχνά σκέφτονται από προεπιλογή λίστες. Ωστόσο, η Python προσφέρει μια πιο εξειδικευμένη δομή πίνακα μέσω του ενσωματωμένου της array μονάδα μέτρησης. Αυτή η ενότητα παρέχει μια αποδοτική αποθήκευση χώρου βασικών τύπων δεδομένων τύπου C στην Python.

Ενώ οι λίστες Python είναι απίστευτα ευέλικτες και μπορούν να αποθηκεύσουν οποιοδήποτε είδος αντικειμένου, μερικές φορές μπορεί να είναι υπερβολικές, ειδικά όταν χρειάζεται μόνο να αποθηκεύσετε μια συλλογή βασικών τύπων δεδομένων, όπως ακέραιους αριθμούς ή float. ο array Η ενότητα παρέχει έναν τρόπο δημιουργίας συστοιχιών που είναι πιο αποδοτικές στη μνήμη από λίστες για συγκεκριμένους τύπους δεδομένων.

Δημιουργία πίνακα

Για να χρησιμοποιήσετε το array ενότητα, πρέπει πρώτα να την εισαγάγετε:

from array import array

Μετά την εισαγωγή, μπορείτε να δημιουργήσετε έναν πίνακα χρησιμοποιώντας το array() κατασκευαστής:

arr = array('i', [1, 2, 3, 4, 5])
print(arr)

Εδώ, το 'i' Το όρισμα υποδεικνύει ότι ο πίνακας θα αποθηκεύσει υπογεγραμμένο ακέραιους αριθμούς. Υπάρχουν αρκετοί άλλοι διαθέσιμοι κωδικοί τύπων, όπως π.χ 'f' για πλωτήρες και 'd' για διπλά.

Πρόσβαση και τροποποίηση στοιχείων

Μπορείτε να αποκτήσετε πρόσβαση και να τροποποιήσετε στοιχεία σε έναν πίνακα, όπως θα κάνατε με μια λίστα:

print(arr[2]) 

Και τώρα, ας τροποποιήσουμε το στοιχείο αλλάζοντας την τιμή του σε 6:

arr[2] = 6
print(arr) 

Μέθοδοι Πίνακας

Η array Η ενότητα παρέχει διάφορες μεθόδους χειρισμού πινάκων:

  • append() – Προσθέτει ένα στοιχείο στο τέλος του πίνακα:

    arr.append(7)
    print(arr) 
  • extend() – Προσθέτει επαναλαμβανόμενα στοιχεία στο τέλος:

    arr.extend([8, 9])
    print(arr) 
  • pop() – Αφαιρεί και επιστρέφει το στοιχείο στη δεδομένη θέση:

    arr.pop(2)
    print(arr) 
  • remove(): Καταργεί την πρώτη εμφάνιση της καθορισμένης τιμής:

    arr.remove(2)
    print(arr) 
  • reverse(): Αντιστρέφει τη σειρά του πίνακα:

    arr.reverse()
    print(arr) 

Σημείωση: Υπάρχουν περισσότερες μέθοδοι από αυτές που παραθέτουμε εδώ. Αναφέρομαι στο επίσημη τεκμηρίωση Python για να δείτε μια λίστα με όλες τις διαθέσιμες μεθόδους στο array μονάδα μέτρησης.

Ενώ η array Η μονάδα προσφέρει έναν πιο αποδοτικό τρόπο αποθήκευσης βασικών τύπων δεδομένων, είναι απαραίτητο να τον θυμάστε περιορισμούς. Σε αντίθεση με τις λίστες, οι πίνακες είναι ομοιογενής. Αυτό σημαίνει ότι όλα τα στοιχεία του πίνακα πρέπει να είναι του ίδιου τύπου. Επίσης, μπορείτε μόνο να αποθηκεύσετε βασικοί τύποι δεδομένων τύπου C σε συστοιχίες. Εάν χρειάζεται να αποθηκεύσετε προσαρμοσμένα αντικείμενα ή άλλους τύπους Python, θα χρειαστεί να χρησιμοποιήσετε μια λίστα ή άλλη δομή δεδομένων.

Πίνακες NumPy

Το NumPy, συντομογραφία του Numerical Python, είναι ένα βασικό πακέτο για αριθμητικούς υπολογισμούς στην Python. Ένα από τα κύρια χαρακτηριστικά του είναι η ισχυρή του Αντικείμενο πίνακα Ν-διάστατων, το οποίο προσφέρει γρήγορες λειτουργίες σε πίνακες, συμπεριλαμβανομένων μαθηματικών, λογικών, χειραγώγησης σχήματος και άλλα.

Οι πίνακες NumPy είναι πιο ευέλικτοι από τους ενσωματωμένους της Python array ενότητα και αποτελούν βασικό στοιχείο σε έργα επιστήμης δεδομένων και μηχανικής μάθησης.

Γιατί να χρησιμοποιήσετε πίνακες NumPy;

Το πρώτο πράγμα που έρχεται στο μυαλό είναι επίδοση. Οι πίνακες NumPy υλοποιούνται σε C και επιτρέπουν την αποτελεσματική αποθήκευση μνήμης και ταχύτερες λειτουργίες λόγω βελτιστοποιημένων αλγορίθμων και των πλεονεκτημάτων της συνεχούς αποθήκευσης μνήμης.

Ενώ οι ενσωματωμένες λίστες και πίνακες της Python είναι μονοδιάστατες, οι πίνακες NumPy μπορούν να πολυδιάστατη, καθιστώντας τα ιδανικά για την αναπαράσταση πινάκων ή τανυστών.

Ρίξτε μια ματιά στον πρακτικό μας οδηγό για την εκμάθηση του Git, με βέλτιστες πρακτικές, πρότυπα αποδεκτά από τον κλάδο και συμπεριλαμβανόμενο φύλλο εξαπάτησης. Σταματήστε τις εντολές του Git στο Google και πραγματικά μαθαίνουν το!

Τέλος, το NumPy παρέχει ένα μεγάλη γκάμα λειτουργιών για να λειτουργήσει σε αυτούς τους πίνακες, από βασικές αριθμητικές έως προηγμένες μαθηματικές πράξεις, αναμόρφωση, διάσπαση και πολλά άλλα.

Σημείωση: Όταν γνωρίζετε εκ των προτέρων το μέγεθος των δεδομένων, η εκ των προτέρων εκχώρηση μνήμης για πίνακες (ειδικά στο NumPy) μπορεί να οδηγήσει σε βελτιώσεις στην απόδοση.

Δημιουργία πίνακα NumPy

Για να χρησιμοποιήσετε το NumPy, πρέπει πρώτα να το εγκαταστήσετε (pip install numpy) και, στη συνέχεια, εισάγετέ το:

import numpy as np

Μετά την εισαγωγή, μπορείτε να δημιουργήσετε έναν πίνακα NumPy χρησιμοποιώντας το array() λειτουργία:

arr = np.array([1, 2, 3, 4, 5])
print(arr) 

Μπορείτε επίσης να δημιουργήσετε πολυδιάστατους πίνακες:

matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(matrix)

Αυτό θα μας δώσει:

[[1 2 3] [4 5 6] [7 8 9]]

Εκτός από αυτούς τους βασικούς τρόπους με τους οποίους μπορούμε να δημιουργήσουμε πίνακες, το NumPy μας παρέχει άλλους έξυπνους τρόπους με τους οποίους μπορούμε να δημιουργήσουμε πίνακες. Ένα από τα οποία είναι το arange() μέθοδος. Δημιουργεί πίνακες με τιμές που αυξάνονται τακτικά:

arr = np.arange(10)
print(arr) 

Ένα άλλο είναι το linspace() μέθοδος, η οποία δημιουργεί πίνακες με καθορισμένο αριθμό στοιχείων, σε ίση απόσταση μεταξύ καθορισμένων τιμών αρχής και τέλους:

even_space = np.linspace(0, 1, 5)
print(even_space) 

Πρόσβαση και τροποποίηση στοιχείων

Η πρόσβαση και η τροποποίηση στοιχείων σε έναν πίνακα NumPy είναι διαισθητική:

print(arr[2]) arr[2] = 6
print(arr) 

Κάνοντας σχεδόν το ίδιο για πολυδιάστατους πίνακες:

print(matrix[1, 2]) matrix[1, 2] = 10
print(matrix)

Θα αλλάξει η τιμή του στοιχείου στη δεύτερη σειρά (ευρετήριο 1) και την τρίτη στήλη (ευρετήριο 2):

[[1 2 3] [4 5 20] [7 8 9]]

Αλλαγή του σχήματος ενός πίνακα

Το NumPy προσφέρει πολλές λειτουργίες και μεθόδους χειρισμού και χειρισμού πινάκων. Για παράδειγμα, μπορείτε να χρησιμοποιήσετε το reshape() μέθοδος για αλλάξτε το σχήμα ενός πίνακα. Ας πούμε ότι έχουμε έναν απλό πίνακα:

import numpy as np arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
print("Original Array:")
print(arr) 

Και θέλουμε να το αναδιαμορφώσουμε σε έναν πίνακα 3×4. Το μόνο που χρειάζεται να κάνετε είναι να χρησιμοποιήσετε το reshape() μέθοδος με επιθυμητές διαστάσεις μεταβιβάζονται ως ορίσματα:


reshaped_arr = arr.reshape(3, 4)
print("Reshaped Array (3x4):")
print(reshaped_arr)

Αυτό θα έχει ως αποτέλεσμα:

Reshaped Array (3x4):
[[ 1 2 3 4] [ 5 6 7 8] [ 9 10 11 12]]

Πολλαπλασιασμός μήτρας

Η numpy.dot() μέθοδος χρησιμοποιείται για πολλαπλασιασμός μήτρας. Επιστρέφει το γινόμενο κουκίδων δύο πινάκων. Για μονοδιάστατους πίνακες, είναι το εσωτερικο προιον των συστοιχιών. Για δισδιάστατους πίνακες, ισοδυναμεί με πολλαπλασιασμός μήτρας, και για τη ΝΔ είναι α αθροιστικό προϊόν πάνω από τον τελευταίο άξονα του πρώτου πίνακα και από τον δεύτερο προς τον τελευταίο του δεύτερου πίνακα.

Ας δούμε πώς λειτουργεί. Αρχικά, ας υπολογίσουμε το γινόμενο κουκίδων δύο πίνακες 1-D (το εσωτερικό γινόμενο των διανυσμάτων):

import numpy as np vec1 = np.array([1, 2, 3])
vec2 = np.array([4, 5, 6])
dot_product_1d = np.dot(vec1, vec2) print("Dot product of two 1-D arrays:")
print(dot_product_1d) 

Αυτό θα έχει ως αποτέλεσμα:

Dot product of two 1-D arrays:
32

32 είναι, στην πραγματικότητα, το εσωτερικό γινόμενο των δύο συστοιχιών - (14 + 25 + 3*6). Στη συνέχεια, μπορούμε να εκτελέσουμε πολλαπλασιασμό μήτρας δύο δισδιάστατων πινάκων:


mat1 = np.array([[1, 2], [3, 4]])
mat2 = np.array([[2, 0], [1, 3]])
matrix_product = np.dot(mat1, mat2) print("Matrix multiplication of two 2-D arrays:")
print(matrix_product) 

Που θα μας δώσει:

Matrix multiplication of two 2-D arrays:
[[ 4 6] [10 12]]

Οι πίνακες NumPy είναι ένα σημαντικό βήμα μπροστά από τις ενσωματωμένες λίστες της Python και το array ενότητα, ειδικά για επιστημονικούς και μαθηματικούς υπολογισμούς. Η αποτελεσματικότητά τους, σε συνδυασμό με την πλούσια λειτουργικότητα που παρέχει η βιβλιοθήκη NumPy, τα καθιστά ένα απαραίτητο εργαλείο για όποιον θέλει να κάνει αριθμητικές πράξεις στην Python.

Συμπέρασμα

Οι συστοιχίες, ακρογωνιαίος λίθος της επιστήμης των υπολογιστών και του προγραμματισμού, έχουν αποδείξει την αξία τους ξανά και ξανά σε διάφορες εφαρμογές και τομείς. Στην Python, αυτή η θεμελιώδης δομή δεδομένων, μέσα από τις διάφορες ενσαρκώσεις της όπως οι λίστες, το array το module και οι ισχυροί πίνακες NumPy, προσφέρουν στους προγραμματιστές ένα μείγμα αποτελεσματικότητας, ευελιξίας και απλότητας.

Σε όλο αυτόν τον οδηγό, έχουμε ταξιδέψει από τις θεμελιώδεις έννοιες των συστοιχιών στις πρακτικές εφαρμογές τους στην Python. Είδαμε πώς οι πίνακες, με τη φύση τους που γειτνιάζουν με τη μνήμη, παρέχουν γρήγορους χρόνους πρόσβασης και πώς οι δυναμικές λίστες της Python προσφέρουν ένα πρόσθετο επίπεδο ευελιξίας. Έχουμε επίσης εμβαθύνει στον εξειδικευμένο κόσμο του NumPy, όπου οι πίνακες μετατρέπονται σε ισχυρά εργαλεία για αριθμητικούς υπολογισμούς.

Σφραγίδα ώρας:

Περισσότερα από Stackabuse