Pređi na sadržaj

NumPy

S Vikipedije, slobodne enciklopedije

NumPy je proširenje na Pajton programskom jeziku, dodajući podršku za velike, višedimenzionalne nizove i matrice, zajedno sa velikim bibliotekama matematičkih funkcija na visokom nivou koje posluju na ovim nizovima. Predak NumPy je originalno stvorio Jim Hugunin uz doprinosime nekoliko drugih programera. U 2005. godini, Trevis Olifant stvorio je NumPy uključivanjem karakteristika konkurenata Numerej u numeričke, sa velikim izmenama. NumPy je otvorenog koda i ima mnogo saradnika.

Osobine[uredi | uredi izvor]

NumPy koristi CPython referentnu implementaciju Pajtona, koja je neoptimalni bajtkodni prevodilac. Matematički algoritmi napisani za ovu verziju Pajtona često rade mnogo sporije nego kompilirani ekvivalenati. NumPy rešava probleme sporosti delom putem obezbeđivanja multidimenzionalnih matrica i funkcija i operatora koji rade efikasno na nizovima, što zahteva pisanje nekog koda, uglavnom za mali broj unutrašnjih petlji koristeći NumPy. Tako je svaki algoritam koji se može izraziti prvenstveno kao operacija na nizovima i matricama može da radi gotovo jednako brzo kao ekvivalentne C kod.[1]

Koristećenje NumPy u Pajtonu proizvodi funkcionalnost koja je uporediva sa MATLABom, jer oba interpretiraju kod i omogućavaju korisniku da brzo napiše programe dok se većina operacija izvršava na nizovima i matricama umesto skalarima. U poređenju MATLAB ima veliki broj dodatnih kutija za alate, posebno Simulink; dok je NumPy suštinski integrisan sa Pajtonom, moderniji, potpun i otvoren jezik izvornog programiranja. Štaviše, komplementarni Pajton paketi su dostupni; SciPy je biblioteka koja dodaje mnoštvo Matlabu sličnih funkcionalnosti i Matplotlib je paket za skiciranje koji omogućava MATLAB sličnan prikaz rezultata i pregleda podataka. Interno se oba jezika, MATLAB i NumPy, oslanjaju na BLAS i LAPACK za efikasna linearno algebarska izračunavanja.

Ndarray struktura podataka[uredi | uredi izvor]

Jezgro funkcionalnosti NumPy-a je njegova "ndarray", za n-dimenzionalni niz, strukture podataka. Ovi nizovi su stavovi o memoriji.[2]  Za razliku od pravljenja strukturi lista podataka u Pajtonu (koji, uprkos imenu, predstavlja Dinamički niz), ovi nizovi su homogeno otkucani: Svi elementi jednog niza moraju biti istog tipa.

Takvi nizovi mogu biti viđeni i u memoriji bafera koje dodeljuje C, C++, C-Pajton i Fortran proširenja na C-Pajton prevodioca, bez potrebe za kopiranjem podataka, dajući stepen kompatibilnosti sa postojećim numeričkim bibliotekama. Ova funkcionalnost je eksploatisana od strane SciPy paketa, koji obavija veliki broj takvih biblioteka (posebno BLAS i LAPACK). NumPy ima ugrađenu podršku za memorijsko-mapiranje ndarray-a.[2]

Ograničenja[uredi | uredi izvor]

NumPy - ovi nizovi moraju biti pregledi na susedne memorijske bafere. Paket zamena se zove Blaze, koji pokušava da prevaziđe ovo ograničenje.[3]

Algoritmi koji nisu izraziti kao vektorske operacije obično rade sporo, jer oni moraju biti implementirani u "čist Pajton", dok vektorizaciju može povećati složenost memorije nekih operacija iz konstantne u linearne, jer se moraju stvoriti privremeni nizovi koji su veliki kao ulazi. Dužina trajanja kompilacije numeričkog koda je sprovedena od strane nekoliko grupa kako bi se izbegli ovi problemi; otvoreni kod rešenja koji radi sa  NumPy uključuje scipy.weave , numexpr[4] i Numba.[5]Cajton je statičko-sastavljanje alternativa na njih.

Primeri[uredi | uredi izvor]

Stvaranje poretka
>>> import numpy as np
>>> x = np.array([1, 2, 3])
>>> x
array([1, 2, 3])
>>> y = np.arange(10) # like Python's range, but returns an array
>>> y
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
Osnovne operacije
>>> a = np.array([1, 2, 3, 6])
>>> b = np.linspace(0, 2, 4) # create an array with four equally spaced points starting with 0 and ending with 2.
>>> c = a - b
>>> c
array([ 1. , 1.33333333, 1.66666667, 4. ])
>>> a**2
array([ 1, 4, 9, 36])
Univerzalne funkcije
>>> a = np.linspace(-np.pi, np.pi, 100) 
>>> b = np.sin(a)
>>> c = np.cos(a)
Linearna algebra
>>> from numpy.random import rand
>>> from numpy.linalg import solve, inv
>>> a = np.array([[1, 2, 3], [3, 4, 6.7], [5, 9.0, 5]])
>>> a.transpose()
array([[ 1. , 3. , 5. ],
       [ 2. ,  4. ,  9. ],
       [ 3. ,  6.7,  5. ]])
>>> inv(a)
array([[-2.27683616, 0.96045198, 0.07909605],
       [ 1.04519774, -0.56497175,  0.1299435 ],
       [ 0.39548023,  0.05649718, -0.11299435]])
>>> b = np.array([3, 2, 1])
>>> solve(a, b) # solve the equation ax = b
array([-4.83050847, 2.13559322, 1.18644068])
>>> c = rand(3, 3) # create a 3x3 random matrix
>>> c
array([[ 3.98732789, 2.47702609, 4.71167924],
       [  9.24410671,   5.5240412 ,  10.6468792 ],
       [ 10.38136661,   8.44968437,  15.17639591]])
>>> np.dot(a, c) # matrix multiplication
array([[ 3.98732789, 2.47702609, 4.71167924],
       [  9.24410671,   5.5240412 ,  10.6468792 ],
       [ 10.38136661,   8.44968437,  15.17639591]])
>>> a @ c # Starting with Python 3.5 and NumPy 1.10
array([[ 3.98732789, 2.47702609, 4.71167924],
       [  9.24410671,   5.5240412 ,  10.6468792 ],
       [ 10.38136661,   8.44968437,  15.17639591]])

 Istorija[uredi | uredi izvor]

Pajton programski jezik nije prvobitno namenjen numeričkom računarstvu, ali je privukao pažnju naučne / inženjerske zajednice, tako da je specijalna interesna grupa pod nazivom matrica-sig osnovana 1995. godine sa ciljem definisanja niza računarskih paketa. Među njenim članovima je bio dizajner i održavalac Pajtona Gvido van Rosum, koji je realizovao proširenja Pajtonove sintakse (posebno sintakse indeksiranja) da bi se olakšali proračuni na nizovima.[6] Implementaciju paketa matrice je uradio Džim Fulton, a zatim generalizovao Džim Hugunin da bi postala numerička,[6] kao i različito nazivane Pajtonove numeričke ekstenzije ili NumPy.[7][8] Hugunin, diplomirani student na MIT-u[8] pridružio se CNRI da radi na J-Pajtonu 1997.[6] Kasnije je Paul Dubojs iz LLNL preuzeo posao održavaoca[8]. Drugi rani doprinosioci su David Ašera, Konrada Hinsena i Travisa Olifanta.[8]

Novi paket pod nazivom Numarray je napisan kao fleksibilnija zamenu za Numeric.[2] Kao Numerički, sada je zastareo.[9] Numarray je imao brže operacije za velike nizove, ali je sporiji nego numerički na malim, pa vremenom oba paketa su korišćeni za različite slučajeve. Poslednja verzija numerička v24.2 puštena je na slobodu 11. novembra 2005. godine i numarray v1.5.2 pušten je 24. avgusta 2006.[10]

Postojala je želja da se Brojne prebace na standardne biblioteke Pajtona, ali Gvido van Rosum (autor Pajtona) je bio sasvim jasan da kod nije bio održiv.

Početkom 2005. godine, NumPy-ev programer Trevis Olifant hteo je da ujedini zajednice oko jednog niza paketa i podrži Numarray-ve funkcije u numeričke, oslobađajući rezultat kao NumPy 1.0 u 2006. godini.[2] Ovaj novi projekat je deo SciPy-a. Da biste izbegli instaliranje velikog SciPy paketa samo da bi dobili niz objekata, ovaj novi paket je izdvojen i nazvan

Oslobađajuća verzija NumPy-a 1.5.1  je kompatibilana sa verzijama Pajton 2.4-2.7 i 3.1-3.2. Podrška za Pajton 3 dodaje se u 1.5.0.[11] U 2011. godini, PyPy počeo je razvoj na implementaciji numpy API za PyPy. [12] To još uvek nije u potpunosti kompatibilan sa NumPy.[13]

Reference[uredi | uredi izvor]

  1. ^ "SciPy PerformancePython" Arhivirano na sajtu Wayback Machine (13. januar 2015).
  2. ^ a b v g Stéfan van der Walt, S. Chris Colbert and Gaël Varoquaux (2011).
  3. ^ "Blaze 0.4.1 Documentation" Arhivirano na sajtu Wayback Machine (8. februar 2015).
  4. ^ Francesc Alted. "numexpr".
  5. ^ "Numba".
  6. ^ a b v Millman, K. Jarrod; Aivazis, Michael (2011).
  7. ^ Travis Oliphant (2007).
  8. ^ a b v g David Ascher; Paul F. Dubois; Konrad Hinsen; Jim Hugunin; Travis Oliphant (1999).
  9. ^ "Numarray Homepage".
  10. ^ "NumPy Sourceforge Files".
  11. ^ "NumPy 1.5.0 Release Notes".
  12. ^ "PyPy Status Blog: Numpy funding and status update".
  13. ^ "NumPyPy Status".