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òriaContextInicialment, 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ístiquesNumPy é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:
AvantatgesCom 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
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]
Alguns grups han treballat per millorar aquesta última limitació; solucions de codi obert que operen amb NumPy són Tipus de dadesNumpy admet una varietat de tipus numèrics molt més gran que la de Python:
ExemplesMatrius de NumPyimport 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]]
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ó algebraicaEl 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
Vegeu tambéEnllaços externs
|
Portal di Ensiklopedia Dunia