Vectorizare și difuzare în Python
Publicat: 2020-12-01Vectorizarea și difuzarea sunt modalități de a accelera timpul de calcul și de a optimiza utilizarea memoriei în timp ce efectuați operații matematice cu Numpy. Aceste metode sunt cruciale pentru a se asigura că complexitatea timpului este redusă, astfel încât algoritmii să nu se confrunte cu blocaje. Această operațiune optimizată este necesară pentru ca aplicațiile să fie scalabile. Vom trece peste ambele tehnici și vom implementa câteva exemple.
Până la sfârșitul acestui tutorial, veți avea cunoștințele despre următoarele:
- Cum se gestionează vectorizarea de către Numpy
- Diferențele de timp cu și fără vectorizare
- Ce este difuzarea
- Cum este diferită Broadcasting față de multiplicarea obișnuită Matrix
Vectorizare
De multe ori avem nevoie de operații matematice pe matrice – cum ar fi înmulțirea matricei. Acum, o modalitate nevectorizată ar fi să faci o înmulțire în funcție de elemente folosind o buclă. Implementarea în acest fel ar duce la aceeași operațiune de multiplicare de mai multe ori, ceea ce ar fi o risipă de resurse de calcul dacă dimensiunea datelor este prea mare. Să aruncăm o privire rapidă.
Mod nevectorizat:
Import aleatoriu a = [random.randint( 1 , 100 ) for _ in range( 10000 )] |
#Ieșire: >> 1000 de bucle, cel mai bun din 3 : 658 µs per buclă |
Mod vectorizat:
import numpy ca np a = np.array([random.randint( 1 , 100 ) for _ in range( 10000 )]) b = np.array([random.randint( 1 , 100 ) pentru _ în interval( 10000 )]) %timeit a*b |
#Ieșire: >> 100000 de bucle, cel mai bun din 3 : 7,25 µs per buclă |
După cum vedem, timpul scurs a trecut de la 658 de microsecunde la doar 7,25 microsecunde. Acest lucru se datorează faptului că atunci când spunem a = np.array([]) , toate operațiunile sunt gestionate intern de numpy. Și când facem a*b , numpy înmulțește în interior matricea completă deodată prin intermediul vectorizării.
Aici folosim comanda %timeit magic pentru a cronometra execuția procesului care ar putea diferi pe mașina dvs.
Să aruncăm o privire la un alt exemplu de produse exterioare a 2 vectori cu dimensiuni (nx1) și (1xm). Ieșirea va fi (nxm).
timpul de import import numpy matrice de import a = array.array( 'i' , [random.randint( 1 , 100 ) for _ in range( 100 )]) b = array.array( 'i' , [random.randint( 1 , 100 ) for _ in range( 100 )]) |
T1 = time.process_time() c = numpy.zeros(( 200 , 200 )) pentru i în interval(len(a)): pentru j în interval(len(b)): c[i][j]= a[i]*b[j] T2 = time.process_time() print( f”Timp de calcul = { 1000 *(T2-T1)} ms” ) |
#Ieșire: >> Timp de calcul = 6,819299000000001 ms |
Acum, hai să o facem cu Numpy,
T1 = time.process_time() c = numpy.exterior(a, b) T2 = time.process_time() print( f”Timp de calcul = { 1000 *(T2-T1)} ms” ) |
#Ieșire: >> Timp de calcul = 0,2256630000001536 ms |
După cum vedem din nou, Numpy procesează aceeași operație mult mai rapid prin vectorizare.
Trebuie citit: Aplicații Python fascinante în lumea reală
Deci, până acum, am văzut exemple în care au fost folosite matrice de aceeași dimensiune. Ce se întâmplă dacă dimensiunile matricelor sunt diferite? Aici intervine o altă caracteristică grozavă a lui Numpy, Broadcasting.
Difuzarea este o altă extensie a vectorizării în care matricele nu trebuie să aibă aceleași dimensiuni pentru a fi efectuate operațiuni pe ele, cum ar fi adunarea, scăderea, înmulțirea etc. Să înțelegem acest lucru printr-un exemplu foarte simplu de adăugare a unei matrice și a unui scalar.
a = np.array([ 1 , 1 , 1 , 1 ]) a+ 5 |
#Ieșire: matrice([ 6 , 6 , 6 , 6 ]) |
După cum vedem, scalarul 5 a fost adăugat la toate elementele. Deci cum sa întâmplat?

Pentru a vă imagina procesul, vă puteți gândi că scalarul 5 se repetă de 4 ori pentru a face o matrice care este apoi adăugată în tabloul a. Dar rețineți că Numpy nu creează astfel de matrice care să ocupe doar memorie. Numpy doar „difuzează” sau dublează scalarul 5 până la 4 locuri pentru a-l adăuga la matrice a.
Să luăm un alt exemplu ușor.
a = np.one(( 3 , 3 )) b = np.one( 3 ) a+b |
#Ieșire: >> matrice([[ 2. , 2. , 2. ], [ 2. , 2. , 2. ], [ 2. , 2. , 2. ]]) |
În exemplul de mai sus, matricea formei (3,1) a fost difuzată către (3,3) pentru a se potrivi cu matricea a.
Dar înseamnă asta că orice matrice cu orice dimensiune poate fi difuzată pentru a se potrivi cu o matrice cu orice dimensiune?
NU!
Reguli de difuzare
Numpy urmează un set de reguli simple pentru a se asigura că sunt difuzate numai matricele care urmează criteriile. Hai să aruncăm o privire.
Regula de difuzare spune că cele 2 matrice care urmează să fie operate trebuie fie să aibă aceleași dimensiuni, fie dacă oricare dintre ele este 1.
Să vedem că acesta este în acțiune.
Exemplul 1:
Luați în considerare matricele de dimensiuni de mai jos:
a = 3 x 4 x 7
b = 3 x 4 x 1
Aici ultima dimensiune a lui b va fi difuzată pentru a se potrivi cu cea de la a la 7.
Prin urmare, rezultatul = 3 x 4 x 7
Exemplul 2:
a = 3 x 4 x 7
b = 4
Acum, numărul de dimensiuni ale lui a și b sunt inegale. În astfel de cazuri, matricea cu un număr mai mic de dimensiuni va fi umplută cu 1.
Deci, aici, prima și ultima dimensiune a lui b sunt 1, așa că vor fi difuzate pentru a se potrivi cu cele de la a la 3 și 7.
Prin urmare, rezultatul = 3 x 4 x 7.
Citiți: Tutorial Python
Exemplul 3:
a = 3 x 4 x 1 x 5
b = 3 x 1 x 7 x 1
Aici, din nou, a doua și ultima dimensiune a lui b vor fi difuzate pentru a se potrivi cu cea a lui a la 4 și 5. De asemenea, a treia dimensiune a lui a va fi difuzată pentru a se potrivi cu cea a lui b la 7.
Prin urmare, rezultatul = 3 x 4 x 7 x 5
Acum să vedem când condiția eșuează:
Exemplul 4:
a = 3 x 4 x 7 x 5
b = 3 x 3 x 7 x 4
Aici, a doua și a patra dimensiune a lui b nu se potrivesc cu a și nici nu sunt 1. În acest caz, Python va arunca o eroare de valoare:
ValueError: operanzii nu au putut fi difuzați împreună cu forme ( 3 , 4 , 7 , 5 ) ( 3 , 3 , 7 , 4 ) |
Exemplul 5:
a = 3 x 4 x 1 x 5
b = 3 x 2 x 3
Rezultat: ValueError
Și aici, a doua dimensiune nu se potrivește și nu este nici 1 pentru niciuna dintre ele.
Inainte sa pleci
Vectorizarea și difuzarea, ambele, sunt metode prin care Numpy își face procesarea optimizată și mai eficientă. Aceste concepte ar trebui să fie reținute în special atunci când se ocupă de matrice și matrice n-dimensionale, care sunt foarte comune în datele de imagine și rețelele neuronale.
Dacă sunteți curios să aflați despre python, știința datelor, consultați Diploma PG în știința datelor de la IIIT-B și upGrad, care este creată pentru profesioniști care lucrează și oferă peste 10 studii de caz și proiecte, ateliere practice practice, mentorat cu experți din industrie, 1-la-1 cu mentori din industrie, peste 400 de ore de învățare și asistență profesională cu firme de top.
Ce este Vectorizarea în Python?
Numpy este un pachet Python care oferă mai multe funcții matematice standard care permit operații rapide pe matrice mari de date fără a fi nevoie de bucle, inclusiv Vectorization. Vectorizarea este folosită pentru a accelera programele Python fără utilizarea buclelor. Utilizarea unei astfel de metode poate ajuta la reducerea cantității de timp necesare pentru executare a codului. Există diverse operații care se efectuează pe vectori, cum ar fi produsul punctual al vectorilor, cunoscut și ca produs scalar, deoarece produce o singură ieșire, produse exterioare, care are ca rezultat o matrice pătrată de dimensiune egală cu lungimea x lungimea vectori, multiplicare pe elemente, care produce elemente cu aceiași indici.
Ce este difuzarea în Python?
Cuvântul difuzare se referă la modul în care Numpy gestionează matrice cu dimensiuni diferite în timpul operațiilor aritmetice care au ca rezultat restricții specifice; matricea mai mică este difuzată în matricea enormă, astfel încât formele lor să fie consecvente. Broadcasting vă permite să vectorizați operațiunile cu matrice astfel încât bucla să aibă loc în C și nu în Python, așa cum face Numpy. Realizează acest lucru fără a crea copii inutile ale datelor, rezultând implementări eficiente de algoritm. În anumite situații, difuzarea este o idee negativă, deoarece are ca rezultat un consum irositor de memorie, ceea ce încetinește procesarea.
Care sunt utilizările NumPy în Python?
NumPy sau Numerical Python este o bibliotecă Python gratuită și open-source, utilizată de aproape fiecare ramură de cercetare și inginerie. Biblioteca NumPy include matrice multidimensionale și structuri de date matrice și oferă metode pentru operarea eficientă pe o matrice, un obiect matrice n-dimensional omogen. Utilizatorii pot folosi NumPy pentru a executa o gamă largă de operații matematice pe tablouri. Îmbunătățește Python cu structuri de date puternice care oferă calcule eficiente cu matrice și matrice, precum și cu o bibliotecă masivă de funcții matematice de nivel înalt care funcționează pe aceste matrice și matrice.