NumPy
![]() ![]() | |||||||||||||
![]() ![]() | |||||||||||||
Tipus | programari lliure, biblioteca Python i programari matemàtic ![]() | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Versió inicial | 1995 ![]() | ||||||||||||
Versió estable | 2.0.1 (21 juliol 2024) ![]() | ||||||||||||
Llicència | llicència BSD de 3 clàusules ![]() | ||||||||||||
Característiques tècniques | |||||||||||||
Sistema operatiu | Unix-like, macOS i Microsoft Windows ![]() | ||||||||||||
Escrit en | Python, C i Fortran ![]() | ||||||||||||
Format de fitxer de lectura | numpy (en) ![]() ![]() | ||||||||||||
Format de fitxer d'escriptura | numpy (en) ![]() ![]() | ||||||||||||
Equip | |||||||||||||
Creador/s | Travis E. Oliphant (en) ![]() ![]() | ||||||||||||
Desenvolupador(s) | Travis E. Oliphant (en) ![]() ![]() ![]() ![]() ![]() | ||||||||||||
Fonts de codi
| |||||||||||||
Més informació | |||||||||||||
Lloc web | numpy.org (anglès) ![]() | ||||||||||||
Stack Exchange | Etiqueta ![]() | ||||||||||||
Seguiment d'errors | Seguiment d'errors ![]() | ||||||||||||
Free Software Directory | NumPy ![]() | ||||||||||||
| |||||||||||||
![]() ![]() ![]() |
NumPy és una extensió de Python, que li agrega major suport per vectors i matrius, constituint una biblioteca de funcions matemàtiques d'alt nivell per operar amb aquests vectors o matrius.[1] El predecessor de NumPy, Numeric, va ser creat originalment per Jim Hugunin amb contribucions d'altres desenvolupadors. El 2005, Travis Oliphant va crear NumPy incorporant característiques de Numarray a NumPy amb algunes modificacions. NumPy és codi obert i té múltiples desenvolupadors.
Història
Context
Inicialment, Python no va ser dissenyat per al càlcul numèric, tot i això va atraure ràpidament l'interès de la comunitat científica i enginyera. D'aquesta manera, malgrat la seva sintaxi expressiva i una gran col·lecció en built-in data types (com strings, list, dictionaries), esdevenia clara una necessitat de proporcionar un nou tipus de varietat per a la informàtica numèrica.
L'any 1995, la comunitat de Python va formar un grup d'interès especialitzat a proporcionar aquesta nova varietat de dades, anomenat matrix-sig. Temps després, Jim Hugunin, estudiant del MIT, va desenvolupar una C-extension module sota el nom de Numeric. Aquest nou mòdul estava basat en l'objecte matriu, publicat un any abans, de Jim Fulton, que incorporava idees de matrix-sig. Mentrestant, es manté una relativament petita i compromesa comunitat d'àmbit científic i de l'enginyeria que utilitza Python i s'interessa per Numeric. Amb el pas del temps aquesta comunitat continua millorant el mòdul i comença a desenvolupar i compartir nous paquets addicionals per a informàtica científica (SciPy).
Entrant al nou segle ens trobem amb un creixement de mòduls d'extensió i un augment d'interès per un medi complet per a la comunitat científica a Python. Durant els següents tres anys es va aconseguir incrementar la utilitat de Python per a aquesta comunitat.
Tanmateix, Perry Greenfield, Todd Miller i Rick White, van desenvolupar un nou paquet d'arrays per Python, anomenat numarray, ja que, tot i la utilitat dels nous paquets que estava tenint, la base de Numeric era difícil d'estendre i desenvolupar. Malauradament, la divisió entre Numeric i numarray va fracturar la comunitat durant uns anys.
Més endavant, Travis Oliphant crea NumPy l'any 2005[2] i interromp la divisió amb el seu llançament l'any 2006, un reescrit del codi Numeric incorporant les característiques més útils de numarray.[3]
Durant 2005 i 2006 es fan les últimes actualitzacions de Numeric i numarray, ja que NumPy esdevé el nou punt de partida.
Característiques
NumPy és el paquet fonamental per la informàtica científica a Python. Aquesta biblioteca proporciona un objecte de varietat multidimensional, diversos objectes derivats, i una varietat de rutines per agilitzar les operacions amb arrays, incloent-hi operacions matemàtiques, lògiques, de manipulació de forma, d'ordenació, de selecció, d'I/O, de la transformada discreta de Fourier, d'àlgebra lineal bàsica, bàsiques d'estadística, de simulació d'atzar, entre d'altres.[4]
Hem de ser conscients que el nucli del paquet de NumPy és l'objecte ndarray, una matriu n-dimensional d'un mateix tipus de dada.[5] Aquest fet marca una important diferència entre les arrays de NumPy i les seqüències estàndard de Python:
- Les arrays a NumPy tenen una mida fixa de creació, a diferència de les llistes de Python, que creixen de manera dinàmica. Per tant, amb NumPy, canviant la mida d'un ndarray en crearà una de nova i eliminarà l'original.
- Els elements dins d'un mateix array de NumPy han de coincidir amb tipus de dades, així que tindran la mateixa mida a memòria. Així i tot existeix una excepció, ja que és possible un array d'objectes, permetent així matrius de diferents mides.
- Les arrays de NumPy faciliten les operacions amb grans números de dades, perquè són executades amb més eficiència i amb menys codi.[4]
Avantatges
Com que Python està implementat com un intèrpret i no com un compilador, els algorismes matemàtics escrits en Python generalment s'executen més lentament que els seus equivalents en llenguatges compilats. NumPy vol solucionar aquest problema per a algorismes numèrics creant operadors i funcions eficients per a vectors multidimensionals. Això fa que qualsevol algorisme que es pugui expressar primàriament com a operacions amb vectors i matrius pot executar-se tant ràpid com ho faria l'algorisme equivalent en llenguatge C.[6]
Python aconsegueix una funcionalitat similar a la de Matlab usant la biblioteca NumPy, ja que ambdós llenguatges són interpretats i ambdós permeten a l'usuari programar algorismes ràpids i eficients sempre que les seves operacions es pugui reduir al tractament de vectors o de matrius en lloc d'usar escalars. En comparació Matlab té un nombre gran de llibreries, a destacar la llibreria Simulink, mentre que NumPy està integrat amb Python, un llenguatge més modern i de codi obert. A més a més, Python disposa de biblioteques complementàries com és ara SciPy, que és una llibreria que fa que les funcionalitats de Python siguin similars a les de Matlab, i Matplotlib que és una biblioteca de recursos gràfics similars a MATLAB. Internament, tant MATLAB com NumPy estan basats en les biblioteques BLAS i LAPACK per executar els càlculs algebraics eficientment.[7]
Limitacions
- Afegir entrades a una matriu no és tan trivial com ho és amb les llistes de Python. Per exemple, la rutina
np.pad()
per estendre la matriu en realitat crea una nova matriu amb la forma desitjada i l'omple, llavors copia l'antiga matriu a la nova, que és la que retornarà. - L'operació
np.concatenate([a1, a2])
realment no enllaçarà les dues matrius, però en retornarà una de nova emplenada amb les dues matrius anteriors en seqüència. - Redimensionar la forma de la matriu amb
np.reshape()
només serà possible sempre que el nombre d'elements de la matriu no canviï.
Totes aquestes limitacions es deuen al fet que les matrius de NumPy han de ser vistes en buffers de memòria contigua. Existeix un paquet que soluciona aquestes limitacions, Blaze.[8]
- El temps d'execució d'aquells algorismes que no són expressables com a operacions vectoritzades normalment serà més lent, ja que han de ser implementats a Python pur, mentre que la vectorització pot augmentar la complexitat a memòria d'algunes operacions, ja que s'hauran de crear arrays temporals amb la mateixa llargada que les inicials.
Alguns grups han treballat per millorar aquesta última limitació; solucions de codi obert que operen amb NumPy són scipy.weave
, numexpr[9] i Numba,[10] mentre que Cython i Pythran són alternatives de compilació estàtica.
Tipus de dades
Numpy admet una varietat de tipus numèrics molt més gran que la de Python:
Tipus de dada | Descripció |
---|---|
bool_ | Boolea (Cert or Fals) desat com a octet |
int_ | Tipus enter per defecte (normalment int64 o int32 ) |
intc | Identic a C int (normalment int32 oint64 ) |
intp | Enter emprat per indexar (normalment int32 o int64 ) |
int8 | Octet (de -128 a 127) |
int16 | Enter (de -32768 a 32767) |
int32 | Enter (de -2147483648 a 2147483647) |
int64 | Enter (de -9223372036854775808 a 9223372036854775807) |
uint8 | Enter absolut - sense signe (de 0 a 255) |
uint16 | Enter absolut - sense signe (de 0 a 65535) |
uint32 | Enter absolut - sense signe (de 0 a 4294967295) |
uint64 | Enter absolut - sense signe (de 0 a 18446744073709551615) |
float_ | float64 per defecte |
float16 | float: sign bit, 5 bits exponent, 10 bits mantissa (Precisió mitja) |
float32 | float: sign bit, 8 bits exponent, 23 bits mantissa (Precisió x1) |
float64 | float: sign bit, 11 bits exponent, 52 bits mantissa (Doble precisió) |
complex_ | complex128 per defecte |
complex64 | Nombre complex, representat per dos 32-bit floats (component reals i imaginaris) |
complexy128 | Nombre complex, representat per dos 64-bit floats (component reals i imaginaris) |
Exemples
Matrius de NumPy
import numpy as np # Creació d'un objecte array arr = np.array([[ 1, 2, 3], [ 4, 2, 5]]) # Mostra el tipus d'array print("Array is of type: ", type(arr)) # Mostra la dimensio de l'array (axes) print("No. of dimensions: ", arr.ndim) # Mostra la forma de array print("Shape of array: ", arr.shape) # Mostra la mida (total d'elements) de l'array print("Size of array: ", arr.size) # Mostra el tipus dels elements de l'array print("Array stores elements of type: ", arr.dtype)
Output:
Array is of type: No. of dimensions: 2 Shape of array: (2, 3) Size of array: 6 Array stores elements of type: int64
Indexació d'arrays
# Python program to demonstrate # indexing in numpy import numpy as np # An exemplar array arr = np.array([[-1, 2, 0, 4], [4, -0.5, 6, 0], [2.6, 0, 7, 8], [3, -7, 4, 2.0]]) # Slicing array temp = arr[:2, ::2] print ("Array with first 2 rows and alternate" "columns(0 and 2):\n", temp) # Integer array indexing example temp = arr[[0, 1, 2, 3], [3, 2, 1, 0]] print ("\nElements at indices (0, 3), (1, 2), (2, 1)," "(3, 0):\n", temp) # boolean array indexing example cond = arr > 0 # cond is a boolean array temp = arr[cond] print ("\nElements greater than 0:\n", temp)
Output:
Array with first 2 rows and alternatecolumns(0 and 2): [[-1. 0.] [ 4. 6.]] Elements at indices (0, 3), (1, 2), (2, 1),(3, 0): [ 4. 6. 0. 3.] Elements greater than 0: [ 2. 4. 4. 6. 2.6 7. 8. 3. 4. 2. ]
Operacions bàsiques
# Python program to demonstrate # basic operations on single array import numpy as np a = np.array([1, 2, 5, 3]) # suma 1 a cada element print ("Adding 1 to every element:", a+1) # resta 3 a cda element print ("Subtracting 3 from each element:", a-3) # multiplicar cada element per 10 print ("Multiplying each element by 10:", a*10) # el quadrat de cada element print ("Squaring each element:", a**2) # modificar un array existent a *= 2 print ("Doubled each element of original array:", a) # transposar l'array a = np.array([[1, 2, 3], [3, 4, 5], [9, 6, 0]]) print ("\nOriginal array:\n", a) print ("Transpose of array:\n", a.T)
Output:
Adding 1 to every element: [2 3 6 4] Subtracting 3 from each element: [-2 -1 2 0] Multiplying each element by 10: [10 20 50 30] Squaring each element: [ 1 4 25 9] Doubled each element of original array: [ 2 4 10 6] Original array: [[1 2 3] [3 4 5] [9 6 0]] Transpose of array: [[1 3 9] [2 4 6] [3 5 0]]
Matplotib
El següent és un exemple de com Numpy manipula vectors i els dibuixa en un gràfic usant la llibreria matplotlib.
import numpy from matplotlib import pyplot # Creant les funcions usant numpy x = numpy.linspace(0,2*numpy.pi, 100) sn = numpy.sin(x) cn = numpy.cos(x) # Dibuixant les funcions usant matplotlib pyplot.plot(x, sn, 'k', label='Sinus') pyplot.plot(x, cn, 'r',label='Cosinus') pyplot.grid(True) pyplot.legend(loc = 'best',shadow = True) pyplot.ylabel("Amplitud") pyplot.xlabel("Temps [segons]") pyplot.title('Exemple matplotlib i numpy') pyplot.show()
Manipulació algebraica
El següent exemple mostra la llibreria Numpy manipulant algebraicament matrius i vectors
>>> 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 = array([3,2,1]) >>> np.solve(a,b) # Solucionant l'equació ax = b array([-4.83050847, 2.13559322, 1.18644068]) >>> c = rand(3,3) # Creant una matriu 3x3 aleatòria >>> c array([[ 3.98732789, 2.47702609, 4.71167924], [ 9.24410671, 5.5240412, 10.6468792 ], [ 10.38136661, 8.44968437, 15.17639591]]) >>> np.dot(a,c) # multiplicació de matrius array([[ 3.98732789, 2.47702609, 4.71167924], [ 9.24410671, 5.5240412, 10.6468792 ], [ 10.38136661, 8.44968437, 15.17639591]])
Referències
- ↑ «What is NumPy?» (en anglès). numpy.org. [Consulta: 28 gener 2014].
- ↑ Oliphant, Travis E. A guide to NumPy (en anglès). USA: Tregol Publishing, 2006, p. 85.
- ↑ Millman, K. Jarrod; Aivazis, Michael «Python for Scientists and Engineers». Computing in Science & Engineering, 13, 2, 2011-03, pàg. 9–12. DOI: 10.1109/MCSE.2011.36. ISSN: 1521-9615.
- ↑ 4,0 4,1 «What is NumPy? — NumPy v1.17 Manual». [Consulta: 14 abril 2020].
- ↑ «Frequently Asked Questions — SciPy.org». Arxivat de l'original el 2013-12-24. [Consulta: 14 abril 2020].
- ↑ «SciPy PerformancePython» (en anglès). Arxivat de l'original el 19 de setembre 2013. [Consulta: 28 gener 2014].
- ↑ «NumPy for Matlab Users» (en anglès). numpy.org. Arxivat de l'original el 29 de desembre 2014. [Consulta: 28 gener 2014].
- ↑ «Blaze Ecosistem Docs» (en anglès). [Consulta: 14 abril 2020].
- ↑ «pydata/numexpr», 09-04-2020. [Consulta: 15 abril 2020].
- ↑ «Numba: A High Performance Python Compiler». [Consulta: 15 abril 2020].
- ↑ «Data types — NumPy v1.10 Manual». [Consulta: 15 abril 2020].
Vegeu també
Enllaços externs
![](http://upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Commons-logo.svg/30px-Commons-logo.svg.png)
- Lloc oficial de NumPy Arxivat 2012-01-20 a Wayback Machine. (en anglès)
- Història de NumPy Arxivat 2007-09-27 a Wayback Machine. (en anglès)
- Introducció a les matrius en NumPy Arxivat 2010-06-12 a Wayback Machine. (en anglès)
- NumPy per a usuaris de Matlab Arxivat 2012-02-09 a Wayback Machine. (en anglès)
- Matplotlib, paquet per graficar amb NumPy (anglès)
- NumPy Reference (anglès)