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.

Crystal Clear app winprops bw.pngNumPy
NumPy logo 2020.svg Modifica el valor a Wikidata
Numpy example.png Modifica el valor a Wikidata
Tipusprogramari lliure, biblioteca Python i programari matemàtic Modifica el valor a Wikidata
Versió inicial1995 Modifica el valor a Wikidata
Versió estable
1.19.4 (2 novembre 2020) Modifica el valor a Wikidata
Llicènciallicència BSD de 3 clàusules Modifica el valor a Wikidata
Característiques tècniques
Sistema operatiuUnix-like, macOS i Microsoft Windows Modifica el valor a Wikidata
Escrit enPython, C i Fortran Modifica el valor a Wikidata
Equip
Creador/sTravis E. Oliphant (en) Tradueix Modifica el valor a Wikidata
Desenvolupador(s)Travis E. Oliphant (en) Tradueix Modifica el valor a Wikidata
Més informació
Lloc webWeb oficial Modifica el valor a Wikidata
Stack ExchangeEtiqueta Modifica el valor a Wikidata
Seguiment d'errorsSeguiment d'errors Modifica el valor a Wikidata
Free Software DirectoryNumPy Modifica el valor a Wikidata

Twitter: numpy_team Modifica el valor a Wikidata

HistòriaModifica

ContextModifica

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ístiquesModifica

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]

AvantatgesModifica

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]

LimitacionsModifica

  • 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 dadesModifica

Numpy admet una varietat de tipus numèrics molt més gran que la de Python:

TIPUS DE DADES[11]
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)

ExemplesModifica

Matrius de NumPyModifica

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'arraysModifica

# 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àsiquesModifica

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

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ó algebraicaModifica

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ènciesModifica

  1. «What is NumPy?» (en anglès). numpy.org. [Consulta: 28 gener 2014].
  2. Oliphant, Travis E. A guide to NumPy (en anglès). USA: Tregol Publishing, 2006, p. 85. 
  3. 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. 4,0 4,1 «What is NumPy? — NumPy v1.17 Manual». [Consulta: 14 abril 2020].
  5. «Frequently Asked Questions — SciPy.org». [Consulta: 14 abril 2020].
  6. «SciPy PerformancePython» (en anglès). [Consulta: 28 gener 2014].
  7. «NumPy for Matlab Users» (en anglès). numpy.org. [Consulta: 28 gener 2014].
  8. «Blaze Ecosistem Docs» (en anglès). [Consulta: 14 abril 2020].
  9. «pydata/numexpr», 09-04-2020. [Consulta: 15 abril 2020].
  10. «Numba: A High Performance Python Compiler». [Consulta: 15 abril 2020].
  11. «Data types — NumPy v1.10 Manual». [Consulta: 15 abril 2020].

Vegeu tambéModifica

Enllaços externsModifica

A Wikimedia Commons hi ha contingut multimèdia relatiu a: NumPy