Πώς να αναδιαμορφώσετε τους πίνακες NumPy στην Python

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

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

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

Τι είναι το Reshaping στους NumPy Arrays;

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

Αυτό είναι ιδιαίτερα χρήσιμο όταν οι διαστάσεις του νέου πίνακα δεν είναι γνωστές αρχικά ή συνάγονται κατά την εκτέλεση. Ή μπορεί επίσης να είναι πιθανό ένα συγκεκριμένο βήμα επεξεργασίας δεδομένων να απαιτεί η είσοδος να έχει συγκεκριμένο σχήμα.

Εδώ είναι χρήσιμο η αναμόρφωση.

Για παράδειγμα, εξετάστε την παρακάτω εικόνα. Έχουμε ένα διάνυσμα — έναν μονοδιάστατο πίνακα 6 στοιχείων. Και μπορούμε να το αναδιαμορφώσουμε σε πίνακες σχημάτων 2×3, 3×2, 6×1 κ.ο.κ.

▶️ Για να ακολουθήσετε τα παραδείγματα σε αυτό το σεμινάριο, πρέπει να έχετε εγκαταστήσει την Python και το NumPy. Εάν δεν έχετε ακόμα το NumPy, ρίξτε μια ματιά στον οδηγό εγκατάστασης του NumPy.

Μπορείτε τώρα να προχωρήσετε και να εισαγάγετε το NumPy με το ψευδώνυμο np, εκτελώντας: import numpy ως np.

Ας προχωρήσουμε στην εκμάθηση της σύνταξης στην επόμενη ενότητα.

Σύνταξη του ανασχηματισμού NumPy()

Ακολουθεί η σύνταξη για τη χρήση του NumPy reshape():

np.reshape(arr, newshape, order="C"|'F'|'A')
  • Το arr είναι οποιοδήποτε έγκυρο αντικείμενο πίνακα NumPy. Εδώ, είναι ο πίνακας που πρέπει να αναδιαμορφωθεί.
  • newshape είναι το σχήμα του νέου πίνακα. Μπορεί να είναι είτε ακέραιος είτε πλειάδα.
  • Όταν το newshape είναι ακέραιος, ο πίνακας που επιστρέφεται είναι μονοδιάστατος.
  • Η σειρά αναφέρεται στη σειρά με την οποία θέλετε να διαβάσετε τα στοιχεία του πίνακα που πρόκειται να αναδιαμορφωθεί.
  • Η προεπιλεγμένη τιμή είναι ‘C’, που σημαίνει ότι τα στοιχεία του αρχικού πίνακα θα διαβαστούν με σειρά ευρετηρίασης τύπου C (ξεκινώντας με 0)
  • Το ‘F’ σημαίνει ευρετηρίαση τύπου Fortran (ξεκινώντας με 1). Και το ‘A’ διαβάζεται στα στοιχεία με σειρά C ή Fortran ανάλογα με τη διάταξη μνήμης του πίνακα πίνακα.
  Πώς να μετακινήσετε σημειώσεις από το iPhone σας στο iCloud

Τι επιστρέφει λοιπόν η np.reshape();

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

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

Προβολή έναντι αντιγράφου των NumPy Arrays

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

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

Χρησιμοποιήστε το NumPy reshape() για να αλλάξετε το σχήμα 1D Array σε 2D Arrays

#1. Ας ξεκινήσουμε δημιουργώντας τον πίνακα δειγμάτων χρησιμοποιώντας np.arange().

Χρειαζόμαστε έναν πίνακα 12 αριθμών, από το 1 έως το 12, που ονομάζεται arr1. Καθώς η συνάρτηση NumPy arange() εξαιρεί το τελικό σημείο από προεπιλογή, ορίστε την τιμή διακοπής σε 13.

Τώρα ας χρησιμοποιήσουμε την παραπάνω σύνταξη και ας επαναδιαμορφώσουμε το arr1 με 12 στοιχεία σε έναν πίνακα 2D σχήματος (4,3). Ας ονομάσουμε αυτό το arr2 με 4 σειρές και 3 στήλες.

import numpy as np

arr1 = np.arange(1,13)
print("Original array, before reshaping:n")
print(arr1)

# Reshape array
arr2 = np.reshape(arr1,(4,3))
print("nReshaped array:")
print(arr2)

Ας ρίξουμε μια ματιά στους αρχικούς και αναμορφωμένους πίνακες.

Original array, before reshaping:

[ 1  2  3  4  5  6  7  8  9 10 11 12]

Reshaped array:
[[ 1  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [10 11 12]]

Αντί να περάσετε στον πίνακα ως όρισμα np.reshape(), μπορείτε επίσης να καλέσετε τη μέθοδο .reshape() στον αρχικό πίνακα.

Μπορείτε να εκτελέσετε το dir(arr1) και θα εμφανίσει όλες τις πιθανές μεθόδους και χαρακτηριστικά που μπορείτε να χρησιμοποιήσετε στο αντικείμενο array arr1.

dir(arr1)

# Output 
[
...
...
'reshape'
...
..
]

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

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

arr.reshape(d0,d1,...,dn)

# where:

# d0, d1,..,dn are the dimensions of the reshaped array

# d0 * d1 * ...* dn = N, the number of elements in arr

Για το υπόλοιπο αυτού του σεμιναρίου, ας χρησιμοποιήσουμε αυτή τη σύνταξη στα παραδείγματά μας.

  OLED Screen Burn-In: Πόσο Ανησυχείτε;

#2. Ας προσπαθήσουμε να αναδιαμορφώσουμε το διάνυσμα 12 στοιχείων σε έναν πίνακα 12 x 1.

import numpy as np

arr1 = np.arange(1,13)
print("Original array, before reshaping:n")
print(arr1)

# Reshape array
arr3 = arr1.reshape(12,1)
print("nReshaped array:")
print(arr3)

Στην παρακάτω έξοδο, μπορείτε να δείτε ότι ο πίνακας έχει αναδιαμορφωθεί όπως απαιτείται.

Original array, before reshaping:

[ 1  2  3  4  5  6  7  8  9 10 11 12]

Reshaped array:
[[ 1]
 [ 2]
 [ 3]
 [ 4]
 [ 5]
 [ 6]
 [ 7]
 [ 8]
 [ 9]
 [10]
 [11]
 [12]]

❔ Λοιπόν, πώς μπορούμε να ελέγξουμε εάν έχουμε λάβει ένα αντίγραφο ή μια προβολή;

Για να το ελέγξετε αυτό, μπορείτε να καλέσετε το χαρακτηριστικό βάσης στον πίνακα που επιστρέφεται.

  • Εάν ο πίνακας είναι αντίγραφο, το βασικό χαρακτηριστικό θα είναι None.
  • Εάν ο πίνακας είναι προβολή, το χαρακτηριστικό βάσης θα είναι ο αρχικός πίνακας.

Ας το επαληθεύσουμε γρήγορα.

arr3.base
# Output
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])

Όπως μπορείτε να δείτε, το βασικό χαρακτηριστικό του arr3 επιστρέφει τον αρχικό πίνακα. Αυτό σημαίνει ότι έχουμε λάβει μια προβολή του αρχικού πίνακα.

#3. Τώρα, ας προσπαθήσουμε να αναδιαμορφώσουμε το διάνυσμα σε έναν άλλο έγκυρο πίνακα 2 x 6.

import numpy as np

arr1 = np.arange(1,13)
print("Original array, before reshaping:n")
print(arr1)

# Reshape array
arr4 = arr1.reshape(2,6)
print("nReshaped array:")
print(arr4)

Και εδώ είναι η έξοδος:

Original array, before reshaping:

[ 1  2  3  4  5  6  7  8  9 10 11 12]

Reshaped array:
[[ 1  2  3  4  5  6]
 [ 7  8  9 10 11 12]]

Στην επόμενη ενότητα, ας επαναδιαμορφώσουμε το arr1 σε έναν πίνακα 3D.

Χρησιμοποιήστε το NumPy reshape() για να αλλάξετε το σχήμα 1D Array σε 3D Arrays

Για να επαναδιαμορφώσουμε το arr1 σε έναν πίνακα 3D, ας ορίσουμε τις επιθυμητές διαστάσεις σε (1, 4, 3).

import numpy as np

arr1 = np.arange(1,13)
print("Original array, before reshaping:n")
print(arr1)

# Reshape array
arr3D = arr1.reshape(1,4,3)
print("nReshaped array:")
print(arr3D)

Τώρα δημιουργήσαμε έναν τρισδιάστατο πίνακα με τα ίδια 12 στοιχεία με τον αρχικό πίνακα arr1.

Original array, before reshaping:

[ 1  2  3  4  5  6  7  8  9 10 11 12]

Reshaped array:
[[[ 1  2  3]
  [ 4  5  6]
  [ 7  8  9]
  [10 11 12]]]

Τρόπος εντοπισμού σφαλμάτων σφαλμάτων τιμής κατά την αναμόρφωση

Αν θυμάστε τη σύνταξη, η αναμόρφωση ισχύει μόνο όταν το γινόμενο των διαστάσεων είναι ίσο με τον αριθμό των στοιχείων του πίνακα.

import numpy as np

arr1 = np.arange(1,13)
print("Original array, before reshaping:n")
print(arr1)

# Reshape array
arr2D = arr1.reshape(4,4)
print("nReshaped array:")
print(arr2D)

Εδώ, προσπαθείτε να αναδιαμορφώσετε έναν πίνακα 12 στοιχείων σε έναν πίνακα 4×4 με 16 στοιχεία. Ο διερμηνέας ρίχνει ένα Σφάλμα τιμής, όπως φαίνεται παρακάτω.

Original array, before reshaping:

[ 1  2  3  4  5  6  7  8  9 10 11 12]
-----------------------------------------------------------
ValueError                                
Traceback (most recent call last)
<ipython-input-11-63552bcc8c37> in <module>()
      6 
      7 # Reshape array
----> 8 arr2 = arr1.reshape(4,4)
      9 print("nReshaped array:")
     10 print(arr2)

ValueError: cannot reshape array of size 12 into shape (4,4)

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

  12 πόροι για να μάθετε Python για αρχάριους

Για παράδειγμα, εάν γνωρίζετε εκ των προτέρων διαστάσεις n – 1, μπορείτε να χρησιμοποιήσετε το -1 για να συμπεράνετε την ν-η διάσταση στον αναδιαμορφωμένο πίνακα.

Εάν έχετε έναν πίνακα 24 στοιχείων και θέλετε να τον επαναδιαμορφώσετε σε έναν πίνακα 3D. Ας υποθέσουμε ότι χρειάζεστε 3 σειρές και 4 στήλες. Μπορείτε να περάσετε την τιμή -1 κατά μήκος της τρίτης διάστασης.

import numpy as np

arr1 = np.arange(1,25)
print("Original array, before reshaping:n")
print(arr1)

# Reshape array
arr_res = arr1.reshape(4,3,-1)
print("nReshaped array:")
print(arr_res)
print(f"Shape of arr_res:{arr_res.shape}")

Όταν εξετάζετε το σχήμα του πίνακα σχημάτων, μπορείτε να δείτε ότι ο αναδιαμορφωμένος πίνακας έχει σχήμα 2 κατά μήκος της τρίτης διάστασης.

Original array, before reshaping:

[ 1  2  3  4  5  6  7  8  9 10 11 12 
13 14 15 16 17 18 19 20 21 22 23 24]

Reshaped array:
[[[ 1  2]
  [ 3  4]
  [ 5  6]]

 [[ 7  8]
  [ 9 10]
  [11 12]]

 [[13 14]
  [15 16]
  [17 18]]

 [[19 20]
  [21 22]
  [23 24]]]
Shape of arr_res:(4, 3, 2)

Αυτό είναι ιδιαίτερα χρήσιμο για την ισοπέδωση μιας συστοιχίας. Και θα μάθετε για αυτό στην επόμενη ενότητα.

Χρησιμοποιήστε το NumPy reshape() για να ισοπεδώσετε έναν πίνακα

Υπάρχουν φορές που θα χρειαστεί να επιστρέψετε από πίνακες Ν-διαστάσεων σε έναν πεπλατυσμένο πίνακα. Ας υποθέσουμε ότι θέλετε να ισοπεδώσετε μια εικόνα σε ένα μακρύ διάνυσμα pixel.

Ας κωδικοποιήσουμε ένα απλό παράδειγμα χρησιμοποιώντας τα ακόλουθα βήματα:

  • Δημιουργήστε έναν πίνακα εικόνων σε κλίμακα του γκρι 3 x 3, img_arr—με εικονοστοιχεία στην περιοχή από 0 έως 255.
  • Στη συνέχεια, ισοπεδώστε αυτό το img_arr και εκτυπώστε τον πεπλατυσμένο πίνακα, flat_arr.
  • Επίσης, εκτυπώστε τα σχήματα img_arr και flat_arr για επαλήθευση.
img_arr = np.random.randint(0, 255, (3,3))
print(img_arr)
print(f"Shape of img_arr: {img_arr.shape}")
flat_arr = img_arr.reshape(-1)
print(flat_arr)
print(f"Shape of flat_arr: {flat_arr.shape}")

Εδώ είναι η έξοδος.

[[195 145  77]
 [ 63 193 223]
 [215  43  36]]
Shape of img_arr: (3, 3)

[195 145  77  63 193 223 215  43  36]
Shape of flat_arr: (9,)

Στο παραπάνω κελί κώδικα, μπορείτε να δείτε ότι το flat_arr είναι ένα 1D διάνυσμα τιμών pixel με 9 στοιχεία.

Συνοψίζοντας👩‍🏫

Ήρθε η ώρα να αναθεωρήσουμε γρήγορα όσα μάθαμε.

  • Χρησιμοποιήστε το np.reshape(arr, newshape) για να αλλάξετε το σχήμα του arr στο σχήμα που καθορίζεται στο newshape. Το newshape είναι μια πλειάδα που καθορίζει τις διαστάσεις του ανασχηματισμένου πίνακα.
  • Εναλλακτικά, χρησιμοποιήστε το arr.reshape(d0, d1, …, dn) για να αναδιαμορφώσετε το arr ώστε να έχει σχήμα d0 x d1 x … x dn
  • Ελέγξτε εάν d0 * d1 * …* dn = N, ο αριθμός των στοιχείων στον αρχικό πίνακα, για να αποφύγετε Σφάλματα τιμής κατά την αναμόρφωση.
  • Χρησιμοποιήστε το -1 για το πολύ μία διάσταση στο νέο σχήμα, εάν θέλετε η διάσταση να συμπεραίνεται αυτόματα.
  • Τέλος, μπορείτε να χρησιμοποιήσετε το arr.reshape(-1) για να ισοπεδώσετε τον πίνακα.

Τώρα που ξέρετε πώς να χρησιμοποιείτε το NumPy reshape(), μάθετε πώς λειτουργεί η συνάρτηση NumPy linspace().

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