Differences

This shows you the differences between two versions of the page.

Link to this comparison view

ps:labs_python:01 [2023/09/28 00:16]
darius.necula
ps:labs_python:01 [2023/10/04 09:21] (current)
ionut.gorgos
Line 1: Line 1:
-===== Introducere ​in Python =====+===== Introducere ​în Python =====
  
 În acest laborator vom încerca să ne familiarizăm cu limbajul de programare Python și vom folosi câteva elemente pe care le vom utiliza in cadrul laboratoarelor de procesarea semnalelor. Majoritatea tehnicilor de procesare de semnal pot fi executate ca operații pe vectori și matrici, deci Python este o unealtă foarte folositoare pentru a face aceste operații. În acest laborator vom încerca să ne familiarizăm cu limbajul de programare Python și vom folosi câteva elemente pe care le vom utiliza in cadrul laboratoarelor de procesarea semnalelor. Majoritatea tehnicilor de procesare de semnal pot fi executate ca operații pe vectori și matrici, deci Python este o unealtă foarte folositoare pentru a face aceste operații.
  
-Laboratoarele se pot face utilizând **Google Colab** (care ne oferă un notebook Python ​in browser în care putem rula cod fără a ne mai preocupa de setup), sau **Pycharm** (care este un IDE dedicat pentru Python).+Laboratoarele se pot face utilizând **Google Colab** (care ne oferă un notebook Python ​în browser în care putem rula cod fără a ne mai preocupa de setup), sau **Pycharm** (care este un IDE dedicat pentru Python).
  
-Vom folosi ultima versiune de [[https://​www.python.org/​downloads/​ | Python 3.11]]+<note important>​Vom folosi ultima versiune de **[[https://​www.python.org/​downloads/​ | Python 3.11]]**</​note>​
  
 [[https://​colab.research.google.com | Google Colab]] [[https://​colab.research.google.com | Google Colab]]
  
-[[https://​www.jetbrains.com/​pycharm/​download | Download Pycharm]] - folosiți versiunea Community care este free+[[https://​www.jetbrains.com/​pycharm/​download | Download Pycharm]] - folosiți versiunea Community care este gratuită
  
 1. Obișnuiți-vă cu mediul de lucru: spațiul de lucru (workspace),​ editarea scriptului, consola. 1. Obișnuiți-vă cu mediul de lucru: spațiul de lucru (workspace),​ editarea scriptului, consola.
Line 21: Line 21:
   * <​nowiki>​scrieți print(a**b)</​nowiki>​   * <​nowiki>​scrieți print(a**b)</​nowiki>​
  
-Pentru procesarea semnalelor ne vom folosi de bibliotecile **scipy** și **numpy**. ​Aceasta ​ne va ajuta să aplicăm o mulțime de operații matematice vectoriale. Putem defini elementele pe care le folosim cel mai des precum vectorii și matricele folosindu-ne de aceaste ​librării+Pentru procesarea semnalelor ne vom folosi de bibliotecile **scipy** și **numpy**. ​Aceastea ​ne vor ajuta să aplicăm o mulțime de operații matematice vectoriale. Putem defini elementele pe care le folosim cel mai desprecum vectorii și matricelefolosindu-ne de aceaste ​biblioteci
-<​note>​Va trebui să importați ​librăriile ​de care aveți nevoie pentru a le folosi +<​note>​Va trebui să importați ​bibliotecile ​de care aveți nevoie pentru a le folosi 
-  ​*import numpy as np +  import numpy as np 
-  ​*import scipy as sp+  import scipy as sp
 </​note>​ </​note>​
  
 2. Vectori 2. Vectori
  
-Semnalele pot fi reprezentate ca secvențe de valori, unde în Python se face, de obicei, prin vectori sau matrici. Să începem cu vectorii.+Semnalele pot fi reprezentate ca secvențe de valori, unde în Python se face, de obicei, prin vectori sau matrice. Să începem cu vectorii.
  
   *Pentru a genera un vector de valori date, putem scrie pur și simplu ceva de genul:   *Pentru a genera un vector de valori date, putem scrie pur și simplu ceva de genul:
-    * vec1 = [1, 2, 3, 4]  ​Notați parantezele drepte '​['​ și '​]'​ necesare pentru a include valori. +    * vec1 = [1, 2, 3, 4]  ​Notați parantezele drepte '​['​ și '​]'​ necesare pentru a include valori. 
-    * sau putem folosi functia array din numpy: vec2 = np.array([1,​ 2, 3, 4])  +    * sau putem folosi functia ​'//array//' ​din numpy: vec2 = np.array([1,​ 2, 3, 4])  
-  * Creați un vector cu 7 elemente de unu (folosind funcția '​np.ones'​),​ iar apoi multiplicați-l cu o constantă. Afișați rezultatul. +  * Creați un vector cu 7 elemente de unu (folosind funcția '//np.ones//'), iar apoi multiplicați-l cu o constantă. Afișați rezultatul. 
-  * Creați un vector de 5 valori aleatoare folosind modulul '​np.random'​.+  * Creați un vector de 5 valori aleatoare folosind modulul '//np.random//'.
   * Indexarea în Python pornește de la 0, deci puteți selecta primul element din vector folosind comanda vec1[0].   * Indexarea în Python pornește de la 0, deci puteți selecta primul element din vector folosind comanda vec1[0].
   * De asemenea, puteți indexa părți din vector: vec1[1:3] pentru a selecta un vector format din al doilea și al treilea element din vec1.   * De asemenea, puteți indexa părți din vector: vec1[1:3] pentru a selecta un vector format din al doilea și al treilea element din vec1.
   * vec1[-2:] selectează ultimele 2 elemente din vec1.   * vec1[-2:] selectează ultimele 2 elemente din vec1.
- +<​note>​Pentru a beneficia de performanță și de operațiile matematice din $numpy$, vom încerca să folosim mereu numpy arrays.</​note>​ 
-3. Matrici+3. Matrice
 <​note>​În Python, putem implementa o matrice ca o listă de liste. Putem trata fiecare element ca o linie a matricei. <​note>​În Python, putem implementa o matrice ca o listă de liste. Putem trata fiecare element ca o linie a matricei.
  
 Spre exemplu, <​nowiki>​X = [[1, 2], [4, 5], [3, 6]]</​nowiki>​ va reprezenta o matrice de 3 pe 2 (3 linii și 2 coloane). Prima linie poate fi selectată ca X[0], iar primul element de pe prima linie poate fi selectat ca X[0][0]. Spre exemplu, <​nowiki>​X = [[1, 2], [4, 5], [3, 6]]</​nowiki>​ va reprezenta o matrice de 3 pe 2 (3 linii și 2 coloane). Prima linie poate fi selectată ca X[0], iar primul element de pe prima linie poate fi selectat ca X[0][0].
  
-În continuare ne vom folosi de **numpy.matrix** pentru a crea și manipula matrice.+În continuare ne vom folosi de **numpy.array** pentru a crea și manipula matrice(2D array) sau putem folosi o clasă deprecated, **numpy.matrix**.
 </​note>​ </​note>​
-  * Creați o matrice de 5x4 de numere aleatoare (e.g. folosind '​np.random'​ ca mai înainte). Apoi creați o matrice cu elemente de unu de aceeași dimensiune. Acum adunați cele două matrici și afișați rezultatul.+  * Creați o matrice de 5x4 de numere aleatoare (e.g. folosind '//np.random//' ca mai înainte). Apoi creați o matrice cu elemente de unu de aceeași dimensiune. Acum adunați cele două matrici și afișați rezultatul.
  
 <​hidden>​ <​hidden>​
Line 60: Line 60:
 4. Transpusa 4. Transpusa
  
-Transpusa unei matrici ​poate fi obținută prin aplicarea funcției transpose pe o matrice: ​**numpy.matrix.transpose**.+Transpusa unei matrice ​poate fi obținută prin aplicarea funcției transpose pe o matrice: ​'//numpy.transpose//'.
  
   * Transpuneți matricea pe care ați creat-o mai devreme.   * Transpuneți matricea pe care ați creat-o mai devreme.
-  * Creați un vector coloană cu elemente de unu, folosind funcția '​np.ones'​ și modificând parametrul shape cu un număr de elemente mai mare decât unu pentru prima dimensiune. Printați acest vector.+  * Creați un vector coloană cu elemente de unu, folosind funcția '//np.ones//' și modificând parametrul shape cu un număr de elemente mai mare decât unu pentru prima dimensiune. Printați acest vector.
   * Acum transpuneți acest vector și printați-l din nou. Care este diferența dintre afișări?   * Acum transpuneți acest vector și printați-l din nou. Care este diferența dintre afișări?
  
Line 74: Line 74:
 </​hidden>​ </​hidden>​
  
-5. Alte modalități pentru a crea vectori și matrici+5. Alte modalități pentru a crea vectori și matrice
  
   * Pentru a crea o secvență continuă (de exemplu de la 1 la 5), putem folosi //range// și list comprehension,​ ca în exemplul v = [x for x in range(1, 10)].   * Pentru a crea o secvență continuă (de exemplu de la 1 la 5), putem folosi //range// și list comprehension,​ ca în exemplul v = [x for x in range(1, 10)].
 Creați o secvență de 10 elemente, pornind de la 5. Creați o secvență de 10 elemente, pornind de la 5.
  
-  * Putem face incrementul diferit de 1, folosind ceva de genul range(1, 10, 3). Încercați și vedeți rezultatul. De asemenea, puteți folosi funcția '​numpy.linspace'​ pentru a crea puncte egal distanțate.+  * Putem face incrementul diferit de 1, folosind ceva de genul range(1, 10, 3). Încercați și vedeți rezultatul. De asemenea, puteți folosi funcția '//numpy.linspace//' pentru a crea puncte egal distanțate.
  
   * Găsiți ce funcție puteți folosi pentru a determina lungimea și dimensiunea vectorilor și matricelor.   * Găsiți ce funcție puteți folosi pentru a determina lungimea și dimensiunea vectorilor și matricelor.
Line 98: Line 98:
  
 În laboratoarele care vor urma va trebui să generăm grafice cu ajutorul cărora vom vizualiza datele noastre. În laboratoarele care vor urma va trebui să generăm grafice cu ajutorul cărora vom vizualiza datele noastre.
-<​note>​Vom folosi matplotlib pentru a genera grafice așa că importați această ​librărie +<​note>​Vom folosi matplotlib pentru a genera grafice așa că importați această ​bibliotecă 
-  ​* **import matplotlib.pyplot as plt** +  import matplotlib.pyplot as plt 
 </​note>​ </​note>​
 +<note important>​Dacă primiți eroare la afișare pe Windows, instalați [[https://​learn.microsoft.com/​en-us/​cpp/​windows/​latest-supported-vc-redist?​view=msvc-170#​visual-studio-2015-2017-2019-and-2022|Microsoft Visual C++ Redistributable]]</​note>​
  
-  * Folosiți funcția '​sin'​ pentru a genera o sinusoidă de frecvență 1 Hz peste 1 secundă (astfel încât ar trebui să obțineți o perioadă completă). Pentru asta trebuie să generați intervalul de timp peste [0 ... 1] în pași foarte mici (e.g. 100 de puncte) și apoi să apelați funcția sin(2*pi*f*t) peste această secvență (unde f este frecvența, t este intervalul de timp, iar pi este numărul 3.1415...) pentru a obține sinusoida ca o secvență. Observație:​ Folosiți numpy.py pentru variabila //pi// ! +  * Folosiți funcția '//sin//' pentru a genera o sinusoidă de frecvență 1 Hz peste 1 secundă (astfel încât ar trebui să obțineți o perioadă completă). Pentru asta trebuie să generați intervalul de timp peste [0 ... 1] în pași foarte mici (e.g. 100 de puncte) și apoi să apelați funcția sin(2*pi*f*t) peste această secvență (unde f este frecvența, t este intervalul de timp, iar pi este numărul 3.1415...) pentru a obține sinusoida ca o secvență. Observație:​ Folosiți ​//numpy.pi// pentru variabila //pi// ! 
-  * Plotați sinusoida pe care ați făcut-o mai devreme folosind funcția '​plt.plot'​.+  * Plotați sinusoida pe care ați făcut-o mai devreme folosind funcția '//plt.plot//'.
   * Schimbați culoarea liniei sinusoidei.   * Schimbați culoarea liniei sinusoidei.
   * Schimbați tipul liniei sinusoidei.   * Schimbați tipul liniei sinusoidei.
Line 118: Line 119:
   * Generați un semnal care conține suma celor două sinusoide.   * Generați un semnal care conține suma celor două sinusoide.
   * Afișați aceste trei semnale și verificați diferențele. ​   * Afișați aceste trei semnale și verificați diferențele. ​
-<note tip>​Hint:​ folosiți '​figure',​ înaintea fiecărei comenzi '​plot'​ pentru a genera trei grafice diferite sau afișați-le pe toate în același grafic (sau în două grafice, unul pentru sinusoida inițială și altul pentru sinusoida rezultată).</​note>​+<note tip>​Hint:​ folosiți '//figure//', înaintea fiecărei comenzi '//plot//' pentru a genera trei grafice diferite sau afișați-le pe toate în același grafic (sau în două grafice, unul pentru sinusoida inițială și altul pentru sinusoida rezultată).</​note>​
  
 Ar trebui să obțineți ceva de genul: Ar trebui să obțineți ceva de genul:
Line 125: Line 126:
 9. O aplicație ușoară 9. O aplicație ușoară
  
-În acestă arhivă {{:​ps:​labs_python:​data.zip|data.zip}} aveți trei imagini, reprezentate ca matrici ​tridimensionale (o matrice per culoare - R, G, B).+În acestă arhivă {{:​ps:​labs_python:​data.zip|data.zip}} aveți trei imagini, reprezentate ca matrice ​tridimensionale (o matrice per culoare - R, G, B).
 Matricile reprezintă o imagine Img_initial care a fost distorsionată prin adăugarea unui zgomot (matricele R1 și R2), prin formula: Matricile reprezintă o imagine Img_initial care a fost distorsionată prin adăugarea unui zgomot (matricele R1 și R2), prin formula:
 IR = Img_initial * 0.3 + R1 * 0.3 + R2 * 0.3 IR = Img_initial * 0.3 + R1 * 0.3 + R2 * 0.3
Line 132: Line 133:
  
   * dezarhivați imaginile și încărcați-le în mediul vostru de lucru   * dezarhivați imaginile și încărcați-le în mediul vostru de lucru
-  * încărcați ​matricile ​(puteți folosi funția '//​imread//'​ din biblioteca ​'//​matplotlib.image//'​) +  * încărcați ​matricele ​(puteți folosi funția '//​imread//'​ din modulul ​'//​matplotlib.image//'​) 
-  * afișați cele trei imagini date (matrici) pentru a le vizualiza, folosind funcția '//​imshow//'​ din '//​matplotlib.pyplot//',​ e.g. '​plt.imshow(R1)'​. +  * afișați cele trei imagini date (matrice) pentru a le vizualiza, folosind funcția '//​imshow//'​ din '//​matplotlib.pyplot//',​ e.g. '//plt.imshow(R1)//'. 
-  * scădeți cumva matricile ​de zgomot+  * scădeți cumva matricele ​de zgomot
   * afișați imaginea după ce ați eliminat zgomotul   * afișați imaginea după ce ați eliminat zgomotul
  
Line 141: Line 142:
 10. Row-major 10. Row-major
  
-În numpy se foloseste convenția de row-major, deci este indicat să se parcurgă întâi dimensiunea cea mai din dreapta (în cazul matricelor, dimensiunea ​rândurilor). De asemenea, mereu când este posibil, este indicat să se folosească operații vectoriale.+În numpy se foloseste convenția de row-major, deci este indicat să se parcurgă întâi dimensiunea cea mai din dreapta (în cazul matricelor, dimensiunea ​liniilor). De asemenea, mereu când este posibil, este indicat să se folosească operații vectoriale. 
 +<note important>​ 
 +În mod default operatorul '​*'​ va face înmulțire element cu element. 
 +Pentru înmulțire de matrici trebuie să folosim funcția '​numpy.dot'​ sau operatorul '​@'​. 
 +</​note>​
  
 <code python> <code python>
ps/labs_python/01.1695849369.txt.gz · Last modified: 2023/09/28 00:16 by darius.necula
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0