Cum să remodelați matricele NumPy în Python

În acest tutorial, veți învăța cum să utilizați NumPy reshape() pentru a remodela tablourile NumPy fără a modifica datele originale.

Când lucrați cu matrice Numpy, este posibil să doriți adesea să remodelați o matrice existentă într-o matrice de dimensiuni diferite. Acest lucru poate fi deosebit de util atunci când transformați datele în mai mulți pași.

Și NumPy reshape() vă ajută să o faceți cu ușurință. În următoarele câteva minute, veți învăța sintaxa pentru a utiliza reshape() și, de asemenea, veți remodela matricele la diferite dimensiuni.

Ce este Reshaping în NumPy Arrays?

Când lucrați cu matrice NumPy, este posibil să doriți mai întâi să creați o matrice unidimensională de numere. Și apoi remodelați-o într-o matrice cu dimensiunea dorită.

Acest lucru este deosebit de util atunci când dimensiunile noii matrice nu sunt cunoscute inițial sau sunt deduse în timpul execuției. Sau poate fi, de asemenea, posibil ca o anumită etapă de prelucrare a datelor să necesite ca intrarea să aibă o formă specifică.

Iată unde este utilă remodelarea.

De exemplu, luați în considerare următoarea ilustrație. Avem un vector — o matrice unidimensională de 6 elemente. Și îl putem remodela în matrice de forme 2×3, 3×2, 6×1 și așa mai departe.

▶️ Pentru a urma exemplele din acest tutorial, trebuie să aveți instalate Python și NumPy. Dacă nu aveți încă NumPy, consultați ghidul nostru de instalare NumPy.

Acum puteți continua și importa NumPy sub alias np, rulând: import numpy ca np.

Să continuăm să învățăm sintaxa în secțiunea următoare.

Sintaxa lui NumPy reshape()

Iată sintaxa pentru a utiliza NumPy reshape():

np.reshape(arr, newshape, order="C"|'F'|'A')
  • arr este orice obiect matrice NumPy valid. Aici, este matricea care trebuie remodelată.
  • newshape este forma noii matrice. Poate fi fie un număr întreg, fie un tuplu.
  • Când newshape este un număr întreg, tabloul returnat este unidimensional.
  • ordinea se referă la ordinea în care doriți să citiți elementele matricei care urmează să fie remodelate.
  • Valoarea implicită este „C”, ceea ce înseamnă că elementele matricei originale vor fi citite într-o ordine de indexare asemănătoare C (începând cu 0)
  • „F” înseamnă indexare de tip Fortran (începând cu 1). Și „A” citește elementele fie în ordinea C, fie în ordinea Fortran, în funcție de aspectul de memorie al matricei arr.
  Terraform vs. Kubernetes: comparație cap la cap

Deci, ce returnează np.reshape()?

Dacă este posibil, returnează o vizualizare remodelată a matricei originale. În caz contrar, returnează o copie a matricei.

În rândul de mai sus, am menționat că NumPy reshape() ar încerca să returneze o vizualizare ori de câte ori este posibil. În caz contrar, returnează o copie. Să continuăm să discutăm despre diferențele dintre o vizualizare și o copie.

Vizualizare vs. copiere a tablourilor NumPy

După cum sugerează și numele, copie este o copie a matricei originale. Și orice modificări aduse copiei nu vor afecta matricea originală.

Pe de altă parte, vizualizarea se referă pur și simplu la vizualizarea remodelată a matricei originale. Aceasta înseamnă că orice modificare adusă vizualizării va afecta și matricea originală și invers.

Utilizați NumPy reshape() pentru a remodela 1D Array în 2D Arrays

#1. Să începem prin a crea matricea de probă folosind np.arange().

Avem nevoie de o matrice de 12 numere, de la 1 la 12, numite arr1. Deoarece funcția NumPy arange() exclude punctul final în mod implicit, setați valoarea de oprire la 13.

Acum să folosim sintaxa de mai sus și să remodelăm arr1 cu 12 elemente într-o matrice 2D de formă (4,3). Să numim acest lucru arr2 cu 4 rânduri și 3 coloane.

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)

Să aruncăm o privire la matricele originale și remodelate.

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]]

În loc să treceți în matrice ca argument np.reshape(), puteți apela și metoda .reshape() pe tabloul original.

Puteți rula dir(arr1) și va enumera toate metodele și atributele posibile pe care le puteți utiliza pe obiectul matrice arr1.

dir(arr1)

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

În celula de cod de mai sus, puteți vedea că .reshape() este o metodă validă de utilizat pe matricea existentă NumPy arr1.

▶️ Deci, puteți utiliza și următoarea sintaxă simplificată pentru a remodela tablourile 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

Pentru restul acestui tutorial, permiteți-ne să folosim această sintaxă în exemplele noastre.

  Cum să adăugați un cod de acces la Nintendo Switch

#2. Să încercăm să remodelăm vectorul nostru de 12 elemente într-o matrice de 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)

În rezultatul de mai jos, puteți vedea că matricea a fost remodelată după cum este necesar.

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]]

❔ Deci, cum verificăm dacă am obținut o copie sau o vizualizare?

Pentru a verifica acest lucru, puteți apela atributul de bază din matricea returnată.

  • Dacă matricea este o copie, atributul de bază va fi None.
  • Dacă matricea este o vizualizare, atributul de bază va fi matricea originală.

Să verificăm rapid acest lucru.

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

După cum puteți vedea, atributul de bază al arr3 returnează tabloul original. Aceasta înseamnă că am primit o vizualizare a matricei originale.

#3. Acum, să încercăm să remodelăm vectorul într-un alt tablou valid 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)

Și iată rezultatul:

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]]

În secțiunea următoare, să remodelăm arr1 într-o matrice 3D.

Utilizați NumPy reshape() pentru a remodela 1D Array în 3D Array

Pentru a remodela arr1 într-o matrice 3D, să setăm dimensiunile dorite la (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)

Acum am creat o matrice 3D cu aceleași 12 elemente ca și matricea originală 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]]]

Cum să depanați erorile de valoare în timpul remodelării

Dacă vă amintiți sintaxa, remodelarea este valabilă numai atunci când produsul dimensiunilor este egal cu numărul de elemente din matrice.

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)

Aici, încercați să remodelați o matrice de 12 elemente într-o matrice 4×4 cu 16 elemente. Interpretul aruncă o eroare de valoare, așa cum se vede mai jos.

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)

Pentru a evita astfel de erori, puteți utiliza -1 pentru a deduce automat forma pentru una dintre dimensiuni – pe baza numărului total de elemente.

  Poate AI să facă poezie? (ChatGPT și altele au fost testate)

De exemplu, dacă cunoașteți n – 1 dimensiuni în prealabil, puteți utiliza -1 pentru a deduce dimensiunea a n-a din tabloul remodelat.

Dacă aveți o matrice de 24 de elemente și doriți să o remodelați într-o matrice 3D. Să presupunem că aveți nevoie de 3 rânduri și 4 coloane. Puteți trece valoarea -1 de-a lungul celei de-a treia dimensiuni.

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}")

Când examinați forma matricei de formă, puteți vedea că matricea remodelată are o formă de 2 de-a lungul celei de-a treia dimensiuni.

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)

Acest lucru este deosebit de util în aplatizarea unei matrice. Și veți afla despre asta în secțiunea următoare.

Utilizați NumPy reshape() pentru a aplatiza o matrice

Există momente când ar trebui să vă întoarceți de la matrice N-dimensională la o matrice aplatizată. Să presupunem că doriți să aplatizați o imagine într-un vector lung de pixeli.

Să codificăm un exemplu simplu utilizând următorii pași:

  • Generați o matrice de imagini în tonuri de gri 3 x 3, img_arr, cu pixeli în intervalul 0 la 255.
  • Apoi, aplatizați acest img_arr și tipăriți matricea aplatizată, flat_arr.
  • De asemenea, tipăriți formele img_arr și flat_arr pentru a verifica.
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}")

Iată rezultatul.

[[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,)

În celula de cod de mai sus, puteți vedea că flat_arr este un vector 1D de valori pixeli cu 9 elemente.

Rezumând👩‍🏫

Este timpul să revizuim rapid ceea ce am învățat.

  • Utilizați np.reshape(arr, newshape) pentru a remodela arr în forma specificată în newshape. newshape este un tuplu care specifică dimensiunile matricei remodelate.
  • Alternativ, utilizați arr.reshape(d0, d1, …, dn) pentru a remodela arr pentru a avea forma d0 x d1 x … x dn
  • Verificați dacă d0 * d1 * …* dn = N, numărul de elemente din tabloul original, pentru a evita erorile de valoare în timpul remodelării.
  • Utilizați -1 pentru cel mult o dimensiune din noua formă dacă doriți ca dimensiunea să fie dedusă automat.
  • În cele din urmă, puteți utiliza arr.reshape(-1) pentru a aplatiza matricea.

Acum că știți cum să utilizați NumPy reshape(), aflați cum funcționează funcția NumPy linspace().

Puteți încerca exemplele de cod din blocnotesul Jupyter, dacă doriți. Dacă sunteți în căutarea altor medii de dezvoltare, consultați ghidul nostru despre alternativele Jupyter.