# 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. 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 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.
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.
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. 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.

## 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.
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.

## 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.
* 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 i Numba, 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 DADES :
| 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_ | complex128per 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

Output:

### Indexació d'arrays

Output:

### Operacions bàsiques

Output:

### Matplotib

El següent és un exemple de com Numpy manipula vectors i els dibuixa en un gràfic usant la llibreria matplotlib.

### Manipulació algebraica

El següent exemple mostra la llibreria Numpy manipulant algebraicament matrius i vectors

## 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, 01-03-2011, pàg. 9–12. DOI: 10.1109/MCSE.2011.36. ISSN: 1521-9615.
* 1 2 «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é

* SciPy
* Matplotlib
* Python

## Enllaços externs

* Lloc oficial de NumPy Arxivat 2012-01-20 a Wayback Machine. (en anglès)
* Matplotlib, paquet per graficar amb NumPy (anglès)
* NumPy Reference (anglès)