Articulo de referencia

NumPy

{{cite web |title=NumPy — NumPy |url=https://numpy.org/ |website=numpy.org |publisher=NumPy developers}} "}},"i":0}}]}"> NumPy (pronunciado / ˈ n ʌ m p aɪ / NUM -py ) es una bib...

NumPy (pronunciado / ˈ n ʌ m p / NUM -py ) es una biblioteca para el lenguaje de programación Python , que añade soporte para matrices y arreglos multidimensionales grandes , junto con una amplia colección de funciones matemáticas de alto nivel para operar con estos arreglos. [ 3 ] El predecesor de NumPy, Numeric, fue creado originalmente por Jim Hugunin con contribuciones de varios otros desarrolladores. En 2005, Travis Oliphant creó NumPy incorporando características del competidor Numarray en Numeric, con extensas modificaciones. NumPy es software de código abierto y cuenta con muchos colaboradores. NumPy está patrocinado fiscalmente por NumFOCUS . [ 4 ]

Historia

signatura de matriz

El lenguaje de programación Python no fue diseñado originalmente para la computación numérica, pero atrajo la atención de la comunidad científica y de ingeniería desde sus inicios. En 1995 se fundó el grupo de interés especial (SIG) matrix-sig con el objetivo de definir un paquete de computación de matrices ; entre sus miembros se encontraba el diseñador y mantenedor de Python, Guido van Rossum , quien extendió la sintaxis de Python (en particular la sintaxis de indexación [ 5 ] ) para facilitar la computación de matrices . [ 6 ]

Numérico

Jim Fulton completó una implementación de un paquete de matrices, que luego Jim Hugunin amplió para admitir matrices multidimensionales y denominó Numeric [ 6 ] (también conocido como "Extensiones numéricas de Python" o "NumPy"), con influencias de la familia de lenguajes APL , Basis, MATLAB , FORTRAN , S y S+ , entre otros. [ 7 ] [ 8 ] Hugunin, estudiante de posgrado en el Instituto Tecnológico de Massachusetts (MIT), [ 8 ] : 10 se unió a la Corporación para Iniciativas Nacionales de Investigación (CNRI) en 1997 para trabajar en JPython , [ 6 ] dejando a Paul Dubois del Laboratorio Nacional Lawrence Livermore (LLNL) como mantenedor. [ 8 ] : 10 Otros colaboradores iniciales incluyen a David Ascher, Konrad Hinsen y Travis Oliphant . [ 8 ] : 10

Numarray

Se escribió un nuevo paquete llamado Numarray como un reemplazo más flexible para Numeric. [ 9 ] Al igual que Numeric, también está ahora obsoleto. [ 10 ] [ 11 ] Numarray tenía operaciones más rápidas para matrices grandes, pero era más lento que Numeric en matrices pequeñas, [ 12 ] por lo que durante un tiempo ambos paquetes se usaron en paralelo para diferentes casos de uso. La última versión de Numeric (v24.2) se lanzó el 11 de noviembre de 2005, mientras que la última versión de numarray (v1.5.2) se lanzó el 24 de agosto de 2006. [ 13 ]

Existía el deseo de incorporar Numeric a la biblioteca estándar de Python, pero Guido van Rossum decidió que el código no era mantenible en su estado actual. [ 14 ]

NumPy

A principios de 2005, el desarrollador de NumPy, Travis Oliphant, quiso unificar la comunidad en torno a un único paquete de matrices y adaptó las características de Numarray a Numeric, publicando el resultado como NumPy 1.0 en 2006. [ 9 ] Este nuevo proyecto formaba parte de SciPy . Para evitar instalar el extenso paquete SciPy solo para obtener un objeto de matriz, este nuevo paquete se separó y se denominó NumPy. La compatibilidad con Python 3 se añadió en 2011 con la versión 1.5.0 de NumPy. [ 15 ]

En 2011, PyPy comenzó el desarrollo de una implementación de la API de NumPy para PyPy. [ 16 ] A fecha de 2023, todavía no es totalmente compatible con NumPy. [ 17 ]

Características

NumPy se basa en la implementación de referencia CPython de Python, que es un intérprete de código de bytes sin optimización . Los algoritmos matemáticos escritos para esta versión de Python suelen ser mucho más lentos que sus equivalentes compilados debido a la ausencia de optimización por parte del compilador. NumPy soluciona este problema de lentitud, en parte, proporcionando matrices multidimensionales, así como funciones y operadores que operan eficientemente sobre matrices; para utilizarlos, es necesario reescribir parte del código, principalmente los bucles internos , usando NumPy.

El uso de NumPy en Python ofrece una funcionalidad comparable a la de MATLAB , ya que ambos son interpretados [ 18 ] y permiten al usuario escribir programas rápidos siempre que la mayoría de las operaciones se realicen con matrices o arreglos en lugar de escalares . En comparación, MATLAB cuenta con una gran cantidad de cajas de herramientas adicionales, en particular Simulink , mientras que NumPy está intrínsecamente integrado con Python, un lenguaje de programación más moderno y completo . Además, existen paquetes complementarios de Python; SciPy es una biblioteca que añade más funcionalidad similar a la de MATLAB y Matplotlib es un paquete de gráficos que proporciona funcionalidad de gráficos similar a la de MATLAB. Aunque MATLAB puede realizar operaciones con matrices dispersas, NumPy por sí solo no puede realizar dichas operaciones y requiere el uso de la biblioteca scipy.sparse. Internamente, tanto MATLAB como NumPy dependen de BLAS y LAPACK para realizar cálculos de álgebra lineal eficientes .

Las interfaces de Python de la popular biblioteca de visión artificial OpenCV utilizan matrices NumPy para almacenar y procesar datos. Dado que las imágenes con múltiples canales se representan simplemente como matrices tridimensionales, la indexación, el seccionamiento o el enmascaramiento con otras matrices son métodos muy eficientes para acceder a píxeles específicos de una imagen. La matriz NumPy, como estructura de datos universal en OpenCV para imágenes, puntos característicos extraídos , núcleos de filtro y mucho más, simplifica enormemente el flujo de trabajo de programación y la depuración . [ 19 ]

Es importante destacar que muchas operaciones de NumPy liberan el bloqueo global del intérprete , lo que permite el procesamiento multihilo. [ 20 ]

NumPy también proporciona una API de C, que permite que el código Python interactúe con bibliotecas externas escritas en lenguajes de bajo nivel. [ 21 ]

La estructura de datos ndarray

La funcionalidad principal de NumPy es su estructura de datos "ndarray", que representa una matriz n- dimensional . Estas matrices son vistas escalonadas de la memoria. [ 9 ] A diferencia de la estructura de datos de lista integrada de Python, estas matrices tienen tipos homogéneos: todos los elementos de una misma matriz deben ser del mismo tipo.

Estas matrices también pueden ser vistas de búferes de memoria asignados por extensiones de C / C++ , Python y Fortran al intérprete CPython sin necesidad de copiar datos, lo que proporciona cierto grado de compatibilidad con las bibliotecas numéricas existentes. Esta funcionalidad es aprovechada por el paquete SciPy, que encapsula varias de estas bibliotecas (en particular BLAS y LAPACK). NumPy tiene soporte integrado para ndarrays mapeados en memoria . [ 9 ]

Limitaciones

Insertar o agregar entradas a un array no es tan sencillo como con las listas de Python. La np.pad(...)rutina para extender arrays crea nuevos arrays con la forma y los valores de relleno deseados, copia el array original en el nuevo y lo devuelve. La np.concatenate([a1,a2])operación de NumPy no enlaza los dos arrays, sino que devuelve uno nuevo, relleno con las entradas de ambos arrays en secuencia. Modificar la dimensionalidad de un array np.reshape(...)solo es posible si el número de elementos del array no cambia. Estas circunstancias se deben a que los arrays de NumPy deben ser vistas de búferes de memoria contiguos .

Los algoritmos que no se pueden expresar como una operación vectorizada suelen ser lentos porque deben implementarse en Python puro, mientras que la vectorización puede aumentar la complejidad de memoria de algunas operaciones de constante a lineal, ya que se deben crear matrices temporales tan grandes como las entradas. Varios grupos han implementado la compilación en tiempo de ejecución de código numérico para evitar estos problemas; entre las soluciones de código abierto que interactúan con NumPy se incluyen numexpr [ 22 ] y Numba [ 23 ] . Cython y Pythran son alternativas de compilación estática a estas.

Muchas aplicaciones modernas de computación científica a gran escala tienen requisitos que superan las capacidades de los arreglos NumPy. Por ejemplo, los arreglos NumPy generalmente se cargan en la memoria de una computadora , que puede tener capacidad insuficiente para el análisis de grandes conjuntos de datos . Además, las operaciones NumPy se ejecutan en una sola CPU . Sin embargo, muchas operaciones de álgebra lineal se pueden acelerar ejecutándolas en clústeres de CPU o en hardware especializado, como GPU y TPU , en los que se basan muchas aplicaciones de aprendizaje profundo . Como resultado, en los últimos años han surgido varias implementaciones alternativas de arreglos en el ecosistema científico de Python, como Dask para arreglos distribuidos y TensorFlow o JAX [ 24 ] para cálculos en GPU. Debido a su popularidad, estas implementan a menudo un subconjunto de la API de NumPy o la imitan, de modo que los usuarios pueden cambiar su implementación de arreglo con cambios mínimos en su código. [ 3 ] Una biblioteca llamada CuPy , [ 25 ] acelerada por el marco CUDA de Nvidia , también ha mostrado potencial para una computación más rápida, siendo un "reemplazo directo" de NumPy. [ 26 ]

Ejemplos

NumPy se importa convencionalmente como np. [ 27 ]

import numpy as np from numpy.typing import NDArraya : NDArray [ int ] = np . matriz ([[ 1 , 2 , 3 , 4 ], [ 3 , 4 , 6 , 7 ], [ 5 , 9 , 0 , 5 ]]) a . transponer ()

Operaciones básicas

from numpy.typing import NDArraya : NDArray [ int ] = np.array ([ 1 , 2 , 3 , 6 ] ) b : NDArray [ int ] = np.linspace ( 0 , 2 , 4 ) # crea un array con cuatro puntos igualmente espaciados que comienzan en 0 y terminan en 2. c : NDArray [ int ] = a - b print ( c ) # imprime array([1 . , 1.33333333, 1.66666667, 4.]) print ( a ** 2 ) # imprime array([1, 4, 9, 36])

Funciones universales

from numpy.typing import NDArray , float64a : NDArray [ float64 ] = np . linspace ( -np.pi , np.pi , 100 ) b : float64 = np .pecado ( a ) c : float64 = np . porque ( a )# Las funciones pueden tomar números y matrices como parámetros. print ( np.sin ( 1 ) ) # imprime 0.8414709848078965 print ( np.sin ( np.array ( [ 1 , 2 , 3 ]))) # imprime array ( [ 0.84147098 , 0.90929743, 0.14112001])

Álgebra lineal

import numpy as np from numpy.linalg import solve , inv from numpy.random import rand from numpy.typing import NDArray , float32 a : NDArray [ float32 ] = np . array ([[ 1 , 2 , 3 ], [ 3 , 4 , 6.7 ], [ 5 , 9.0 , 5 ]]) print ( a . transpose ()) # imprime: # array([[ 1. , 3. , 5. ], # [ 2. , 4. , 9. ], # [ 3. , 6.7, 5. ]]) print ( inv ( a )) # imprime: # array([[-2.27683616, 0.96045198, 0.07909605], # [ 1.04519774, -0.56497175, 0.1299435 ], # [ 0.39548023, 0.05649718, -0.11299435]]) b : NDArray [ int ] = np . array ([ 3 , 2 , 1 ]) print ( solve ( a , b )) # resuelve la ecuación ax = b # imprime array([-4.83050847, 2.13559322, 1.18644068]) c : NDArray [ float32 ] = rand ( 3 , 3 ) * 20 # crea una matriz aleatoria de 3x3 de valores dentro de [0,1] escalada por 20 print ( c ) # imprime: # array([[ 3.98732789, 2.47702609, 4.71167924], # [ 9.24410671, 5.5240412 , 10.6468792 ], # [ 10.38136661, 8.44968437, 15.17639591]]) print ( np . dot ( a , c )) # multiplicación de matrices # imprime: # array([[ 53.61964114, 38.8741616 , 71.53462537], # [ 118.4935668 , 86.14012835, 158.40440712], # [ 155.04043289, 104.3499231 , 195.26228855]]) print ( a @ c ) # A partir de Python 3.5 y NumPy 1.10# imprime: # array([[ 53.61964114, 38.8741616 , 71.53462537], # [ 118.4935668 , 86.14012835, 158.40440712], # [ 155.04043289, 104.3499231 , 195.26228855]])

matrices multidimensionales

import numpy as np from numpy.typing import NDArray , float64M : NDArray [ float64 ] = np.zeros ( shape = ( 2 , 3 , 5 , 7 , 11 )) T : NDArray [ float64 ] = np.transpose ( M , ( 4 , 2 , 1 , 3 , 0 )) print ( T.shape ) # imprime (11, 5, 3 , 7 , 2 )

Integración con OpenCV

import cv2 import numpy as np from numpy.typing import NDArray , float32r : NDArray [ float32 ] = np.reshape ( np.arange ( 256 * 256 ) % 256 , ( 256 , 256 )) # Matriz de píxeles de 256x256 con un gradiente horizontal de 0 a 255 para el canal de color rojo g : NDArray [ float32 ] = np.zeros_like ( r ) # Matriz del mismo tamaño y tipo que r pero rellena con 0s para el canal de color verde b : NDArray [ float32 ] = r . T # La transposición de r dará un gradiente vertical para el canal de color azul print ( cv2 . imwrite ( "gradients.png" , np . dstack ([ b , g , r ]))) # Las imágenes de OpenCV se interpretan como BGR, la matriz apilada en profundidad se escribirá en un archivo PNG RGB de 8 bits llamado "gradients.png" # imprime True

Versión funcional en Python y versión vectorizada en NumPy.

### Python funcional ### from typing import Callablepuntos : lista [ lista [ int ]] = [[ 9 , 2 , 8 ],[ 4 , 7 , 2 ],[ 3 , 4 , 4 ],[ 5 , 6 , 9 ],[ 5 , 0 , 7 ],[ 8 , 2 , 7 ],[ 0 , 3 , 2 ],[ 7 , 3 , 0 ],[ 6 , 1 , 1 ],[ 2 , 9 , 6 ]] qPoint : lista [ int ] = [ 4 , 5 , 3 ] # Función lambda para calcular la distancia euclidiana de dos vectores edistance : Callable [[ lista [ flotante ], lista [ flotante ]], flotante ] = lambda a , b : suma (( a1 - b1 ) ** 2 para a1 , b1 en zip ( a , b )) ** 0.5 # Calcula todas las distancias euclidianas a la vez y devuelve el punto más cercano nearest : list [ int ] = min (( edistance ( i , qpoint ), i ) for i in points )[ 1 ] print ( f "Punto más cercano a q: { nearest } " ) # imprime Punto más cercano a q: [3, 4, 4]### Vectorización equivalente de NumPy ### import numpy as np from numpy.typing import NDArraypuntos : NDArray [ int ] = np . matriz ([[ 9 , 2 , 8 ], [ 4 , 7 , 2 ], [ 3 , 4 , 4 ], [ 5 , 6 , 9 ], [ 5 , 0 , 7 ], [ 8 , 2 , 7 ], [ 0 , 3 , 2 ], [ 7 , 3 , 0 ], [ 6 , 1 , 1 ], [ 2 , 9 , 6 ]]) qPunto : NDArray [ int ] = np . matriz ([ 4 , 5 , 3 ]) minIdx : int = np . argmin ( np . linalg . norm ( points - qPoint , axis = 1 )) # calcula todas las distancias euclidianas a la vez y devuelve el índice de la más pequeña print ( f "Punto más cercano a q: { points [ minIdx ] } " ) # imprime Punto más cercano a q: [3 4 4]

F2PY

Envuelve rápidamente el código nativo para obtener scripts más rápidos. [ 28 ] [ 29 ] [ 30 ]

! Ejemplo de llamada a código nativo de Python Fortran ! f2py -c -m foo *.f90 ! Compila Fortran en un módulo con nombre de Python usando sentencias intent ! Solo subrutinas de Fortran, no funciones: ¡más fácil que JNI con un wrapper de C ! Requiere gfortran y make subroutine ftest ( a , b , n , c , d ) implicit none integer , intent ( in ) :: a , b , n integer , intent ( out ) :: c , d integer :: i c = 0 do i = 1 , n c = a + b + c end do d = ( c * n ) * ( - 1 ) end subroutine ftest
import foo import numpy as npa : tupla [ int , int ] = foo . ftest ( 1 , 2 , 3 ) # o c,d = en lugar de ac y ad print ( a ) # imprime (9,-27) help ( "foo.ftest" ) # imprime el foo.ftest.__doc__

Véase también

Referencias

  1. "Versión 2.5.1" . 4 de julio de 2026. Consultado el 5 de julio de 2026 .
  2. "NumPy — NumPy" . numpy.org . Desarrolladores de NumPy.
  3. 1 2 Charles R Harris; K. Jarrod Millman; Stéfan J. van der Walt; et al. (16 de septiembre de 2020). " Programación de matrices con NumPy" ( PDF) . Nature . 585 (7825): 357–362 . arXiv : 2006.10256 . Bibcode : 2020Natur.585..357H . doi : 10.1038/S41586-020-2649-2 . ISSN 1476-4687 . PMC 7759461. PMID 32939066. Wikidata Q99413970 .     
  4. "Proyectos patrocinados por NumFOCUS" . NumFOCUS . Consultado el 25 de octubre de 2021 .
  5. "Indexación — Manual de NumPy v1.20" . numpy.org . Consultado el 6 de abril de 2021 .
  6. 1 2 3 Millman, K. Jarrod; Aivazis, Michael (2011). "Python para científicos e ingenieros" . Computing in Science and Engineering . 13 (2): 9– 12. Bibcode : 2011CSE....13b...9M . doi : 10.1109/MCSE.2011.36 . Archivado del original el 19 de febrero de 2019. Recuperado el 7 de julio de 2014 .
  7. Travis Oliphant (2007). "Python para computación científica" (PDF) . Computing in Science and Engineering . Archivado del original (PDF) el 14 de octubre de 2013. Consultado el 12 de octubre de 2013 .
  8. ^ David Ascher ; Pablo F. Dubois; Konrad Hinsen; Jim Hugunin; Travis Oliphant (1999). "Python numérico" (PDF) .
  9. 1 2 3 4 van der Walt, Stéfan; Colbert, S. Chris; Varoquaux, Gaël (2011). "The NumPy array: a structure for efficient numerical computation". Computing in Science and Engineering . 13 (2). IEEE: 22. arXiv : 1102.1523 . Bibcode : 2011CSE....13b..22V . doi : 10.1109/MCSE.2011.37 . S2CID 16907816 . 
  10. "Página principal de Numarray" . Consultado el 24 de junio de 2006 .
  11. Travis E. Oliphant (7 de diciembre de 2006). Guía de NumPy . Consultado el 2 de febrero de 2017 .
  12. Travis Oliphant y otros desarrolladores de SciPy. "[Numpy-discussion] Estado de Numeric" . Consultado el 2 de febrero de 2017 .
  13. "Archivos de NumPy en Sourceforge" . Consultado el 24 de marzo de 2008 .
  14. "Historia_de_SciPy - Volcado de la wiki de SciPy" . scipy.github.io .
  15. "Notas de la versión 1.5.0 de NumPy" . Consultado el 29 de abril de 2011 .
  16. "Blog de estado de PyPy: Actualización sobre la financiación y el estado de NumPy" . Consultado el 22 de diciembre de 2011 .
  17. "Estado de NumPyPy" . Consultado el 19 de diciembre de 2023 .
  18. La comunidad SciPy. "NumPy para usuarios de Matlab" . Consultado el 2 de febrero de 2017 .
  19. "OpenCV: Introducción a los tutoriales de OpenCV-Python" . docs.opencv.org . Consultado el 4 de marzo de 2026 .
  20. "notas de la versión de numpy" .
  21. McKinney, Wes (2014). "NumPy Basics: Arrays and Vectorized Computation". Python for Data Analysis (Primera edición, tercera revisión ). O'Reilly. p. 79. ISBN   978-1-449-31979-3.
  22. Francesc Alted. "numexpr" . GitHub . Consultado el 8 de marzo de 2014 .
  23. "Numba" . numba.pydata.org . Consultado el 8 de marzo de 2014 .
  24. Documentaciónː jax .readthedocs .io
  25. Shohei Hido - CuPy: Una biblioteca compatible con NumPy para GPU - PyCon 2018 , archivado del original el 21/12/2021 , recuperado el 11/05/2021
  26. Entschev, Peter Andreas (23 de julio de 2019). "Aceleraciones de CuPy con una sola GPU" . Medium . Consultado el 11 de mayo de 2021 .
  27. "NumPy: lo básico para principiantes § Cómo importar NumPy" . Manual de NumPy . v2.3. Archivado del original el 28 de agosto de 2025. Consultado el 1 de septiembre de 2025. Tras instalar NumPy, se puede importar al código Python de la siguiente manera: 'import numpy as np'. Esta convención generalizada permite acceder a las funciones de NumPy [...]
  28. "Documentación F2PY de NumPy" . NumPy . Consultado el 18 de abril de 2022 .
  29. Worthey, Guy (3 de enero de 2022). "Un enfrentamiento entre Python y Fortran" . Guy Worthey . Consultado el 18 de abril de 2022 .
  30. Shell, Scott. "Escribiendo rutinas rápidas de Fortran para Python" (PDF) . Departamento de Ingeniería de la UCSB . Universidad de California, Santa Bárbara . Consultado el 18 de abril de 2022 .

Lecturas adicionales

  • McKinney, Wes (2022). Python para el análisis de datos (3.ª  ed.). O'Reilly. ISBN 978-1098104030.
  • Bressert, Eli (2012). Scipy y Numpy: Una visión general para desarrolladores . O'Reilly. ISBN 978-1-4493-0546-8.
  • VanderPlas, Jake (2016). «Introducción a NumPy». Python Data Science Handbook: Essential Tools for Working with Data . O'Reilly. pp. 33–96 . ISBN  978-1-4919-1205-8.
  • Sitio web oficialEdita esto en Wikidata
  • Tutoriales de NumPy
  • Historia de NumPy
Obtenido de " https://en.wikipedia.org/w/index.php?title=NumPy&oldid=1359732874 "