From Wikipedia, the free encyclopedia
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.
![]() ![]() | |
![]() ![]() | |
Tipus | programari lliure, biblioteca Python i programari matemàtic ![]() |
---|---|
Versió inicial | 1995 ![]() |
Versió estable | |
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 | |
Format de fitxer d'escriptura | |
Equip | |
Creador/s | Travis E. Oliphant (en) ![]() ![]() |
Desenvolupador(s) | Travis E. Oliphant (en) ![]() ![]() ![]() ![]() ![]() |
Més informació | |
Lloc web | numpy.org (anglès) ![]() |
Stack Exchange | Etiqueta ![]() |
Seguiment d'errors | Seguiment d'errors ![]() |
Free Software Directory | NumPy ![]() |
| |
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.
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:
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]
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à.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.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]
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.
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) |
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
# 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. ]
# 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()
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]])
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.