NumPy (pronunciado / n ʌ m p aɪ / ( NUM -py ) o, a veces / n ʌ m p i / [3] [4] ( NUM -pee )) es una biblioteca para el lenguaje de programación Python , añadiendo soporte para matrices y matrices grandes y multidimensionales , junto con una gran colección de funciones matemáticas de alto nivel para operar en estas matrices. [5] El antepasado 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 amplias modificaciones. NumPy es un software de código abierto y tiene muchos colaboradores.
Autor (es) original (es) | Travis Oliphant |
---|---|
Desarrollador (es) | Proyecto comunitario |
Versión inicial | Como numérico, 1995 ; como NumPy, 2006 |
Lanzamiento estable | 1.20.3 / 10 de mayo de 2021 [1] |
Repositorio | |
Escrito en | Python , C |
Sistema operativo | Multiplataforma |
Tipo | Análisis numérico |
Licencia | BSD [2] |
Sitio web | numpy |
Historia
El lenguaje de programación Python no fue diseñado originalmente para computación numérica, pero atrajo la atención de la comunidad científica y de ingeniería desde el principio. En 1995 se fundó el grupo de interés especial (SIG) matrix-sig con el objetivo de definir un paquete de computación de arreglo ; entre sus miembros estaba el diseñador y mantenedor de Python Guido van Rossum , quien extendió la sintaxis de Python (en particular la sintaxis de indexación [6] ) para facilitar la computación de arreglos . [7]
Una implementación de un paquete de matriz fue completada por Jim Fulton, entonces generalizada [ explicación adicional necesaria ] por Jim Hugunin y llamó numérico [7] (también diversamente conocido como las "Extensiones Numerical Python" o "NumPy"). [8] [9] Hugunin, un estudiante de posgrado en el Instituto de Tecnología de Massachusetts (MIT), [9] : 10 se unió a la Corporación para Iniciativas de Investigación Nacional (CNRI) en 1997 para trabajar en JPython , [7] dejando a Paul Dubois de Lawrence Livermore National Laboratory (LLNL) asumirá el cargo de mantenedor. [9] : 10 Otros contribuyentes tempranos incluyen a David Ascher, Konrad Hinsen y Travis Oliphant . [9] : 10
Se escribió un nuevo paquete llamado Numarray como un reemplazo más flexible de Numeric. [10] Al igual que Numeric, ahora también está obsoleto. [11] [12] Numarray tenía operaciones más rápidas para arreglos grandes, pero era más lento que Numeric en los pequeños, [13] 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 publicó el 11 de noviembre de 2005, mientras que la última versión de numarray (v1.5.2) se publicó el 24 de agosto de 2006. [14]
Había un deseo de incluir Numeric en la biblioteca estándar de Python, pero Guido van Rossum decidió que el código no se podía mantener en su estado en ese momento. [ cuando? ] [15]
A principios de 2005, el desarrollador de NumPy, Travis Oliphant, quería unificar la comunidad en torno a un solo paquete de matriz y portó las características de Numarray a Numeric, lanzando el resultado como NumPy 1.0 en 2006. [10] Este nuevo proyecto era parte de SciPy . Para evitar instalar el gran paquete SciPy solo para obtener un objeto de matriz, este nuevo paquete se separó y se llamó NumPy. El soporte para Python 3 se agregó en 2011 con la versión 1.5.0 de NumPy. [dieciséis]
En 2011, PyPy comenzó a desarrollar una implementación de la API de NumPy para PyPy. [17] Todavía no es totalmente compatible con NumPy. [18]
Características
NumPy apunta a la implementación de referencia CPython de Python, que es un intérprete de código de bytes que no optimiza . Los algoritmos matemáticos escritos para esta versión de Python a menudo se ejecutan mucho más lento que los equivalentes compilados . NumPy aborda el problema de la lentitud en parte proporcionando matrices multidimensionales y funciones y operadores que operan de manera eficiente en matrices; usarlos requiere reescribir algo de código, principalmente bucles internos , usando NumPy.
El uso de NumPy en Python brinda una funcionalidad comparable a MATLAB ya que ambos son interpretados , [19] y ambos permiten al usuario escribir programas rápidos siempre que la mayoría de las operaciones trabajen en arreglos o matrices 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, se encuentran disponibles paquetes complementarios de Python; SciPy es una biblioteca que agrega más funcionalidad similar a MATLAB y Matplotlib es un paquete de trazado que proporciona una funcionalidad de trazado similar a MATLAB. Internamente, tanto MATLAB como NumPy se basan en BLAS y LAPACK para cálculos de álgebra lineal eficientes .
Los enlaces de Python de la biblioteca de visión por computadora ampliamente utilizada OpenCV utilizan matrices NumPy para almacenar y operar con datos. Dado que las imágenes con múltiples canales se representan simplemente como matrices tridimensionales, indexar, cortar o enmascarar con otras matrices son formas muy eficientes de acceder a píxeles específicos de una imagen. La matriz NumPy como estructura de datos universal en OpenCV para imágenes, puntos de características extraídos , núcleos de filtrado y muchos más simplifica enormemente el flujo de trabajo de programación y la depuración .
La estructura de datos ndarray
La funcionalidad principal de NumPy es su estructura de datos "ndarray", para matriz n- dimensional. Estas matrices son vistas escalonadas de la memoria. [10] En contraste con la estructura de datos de lista incorporada de Python, estos arreglos se escriben de manera homogénea: todos los elementos de un solo arreglo deben ser del mismo tipo.
Dichos arreglos también pueden ser vistas en búferes de memoria asignados por las extensiones C / C ++ , Cython y Fortran al intérprete CPython sin la necesidad de copiar datos, lo que brinda un grado de compatibilidad con las bibliotecas numéricas existentes. Esta funcionalidad es explotada por el paquete SciPy , que incluye varias de estas bibliotecas (en particular BLAS y LAPACK ). NumPy tiene soporte integrado para ndarrays mapeados en memoria. [10]
Limitaciones
Insertar o agregar entradas a una matriz no es tan trivialmente posible como lo es con las listas de Python. La np.pad(...)
rutina para extender matrices en realidad crea nuevas matrices de la forma deseada y los valores de relleno, copia la matriz dada en la nueva y la devuelve. La np.concatenate([a1,a2])
operación de NumPy en realidad no vincula las dos matrices, sino que devuelve una nueva, llena con las entradas de ambas matrices dadas en secuencia. np.reshape(...)
Solo es posible remodelar la dimensionalidad de una matriz con siempre que no cambie el número de elementos de la matriz. Estas circunstancias se originan en el hecho de que las matrices de NumPy deben ser vistas en búferes de memoria contiguos. Un paquete de reemplazo llamado Blaze intenta superar esta limitación. [20]
Los algoritmos que no se pueden expresar como una operación vectorizada normalmente se ejecutarán lentamente porque deben implementarse en "Python puro", mientras que la vectorización puede aumentar la complejidad de la memoria de algunas operaciones de constante a lineal, porque se deben crear matrices temporales que sean tan grandes como el entradas. Varios grupos han implementado la compilación en tiempo de ejecución de código numérico para evitar estos problemas; Las soluciones de código abierto que interoperan con NumPy incluyen scipy.weave
, numexpr [21] y Numba . [22] Cython y Pythran son alternativas de compilación estática a estos.
Muchas aplicaciones modernas de computación científica a gran escala tienen requisitos que superan las capacidades de los arreglos NumPy. Por ejemplo, las matrices NumPy generalmente se cargan en la memoria de una computadora , que puede tener una capacidad insuficiente para el análisis de grandes conjuntos de datos. Además, las operaciones de NumPy se ejecutan en una sola CPU . Sin embargo, muchas operaciones de álgebra lineal pueden acelerarse ejecutándolas en clústeres de CPU o de hardware especializado, como GPU y TPU , de los que dependen muchas aplicaciones de aprendizaje profundo . Como resultado, han surgido varias implementaciones de matrices alternativas en el ecosistema científico de Python en los últimos años, como Dask para matrices distribuidas y TensorFlow o JAX para cálculos en GPU. Debido a su popularidad, estos a menudo implementan un subconjunto de la API de Numpy o lo imitan, de modo que los usuarios pueden cambiar la implementación de su matriz con cambios mínimos requeridos en su código. [5] Una biblioteca introducida recientemente [23] llamada CUPy , 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. [24]
Ejemplos de
- Creación de matrices
>>> importar numpy como np >>> x = np . matriz ([ 1 , 2 , 3 ]) >>> x matriz ([1, 2, 3]) >>> y = np . arange ( 10 ) # como la lista de Python (rango (10)), pero devuelve una matriz >>> y matriz ([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
- Operaciones básicas
>>> a = np . matriz ([ 1 , 2 , 3 , 6 ]) >>> b = np . linspace ( 0 , 2 , 4 ) # crea una matriz con cuatro puntos igualmente espaciados comenzando con 0 y terminando con 2. >>> c = a - b >>> c matriz ([1., 1.33333333, 1.66666667, 4.] ) >>> una matriz ** 2 ([1, 4, 9, 36])
- Funciones universales
>>> a = np . linspace ( - np . pi , np . pi , 100 ) >>> b = np . pecado ( a ) >>> c = np . cos ( a )
- Álgebra lineal
>>> de numpy.random import rand >>> de numpy.linalg import solve , inv >>> a = np . matriz ([[ 1 , 2 , 3 ], [ 3 , 4 , 6.7 ], [ 5 , 9.0 , 5 ]]) >>> a . transpose () matriz ([[1., 3., 5.], [2., 4., 9.], [3., 6.7, 5.]]) >>> inv ( a ) matriz ([[ -2,27683616, 0,96045198, 0,07909605], [1,04519774, -0,56497175, 0,1299435], [0,39548023, 0,05649718, -0,11299435]]) >>> b = np . array ([ 3 , 2 , 1 ]) >>> resolver ( a , b ) # resolver la ecuación ax = b array ([- 4.83050847, 2.13559322, 1.18644068]) >>> c = rand ( 3 , 3 ) * 20 # crear una matriz aleatoria de valores de 3x3 dentro de [0,1] escalada por 20 >>> c matriz ([[3.98732789, 2.47702609, 4.71167924], [9.24410671, 5.5240412, 10.6468792], [10.38136661, 8.44968437, 15.17639591]]) > >> np . dot ( a , c ) # matriz de multiplicación de matrices ([[53.61964114, 38.8741616, 71.53462537], [118.4935668, 86.14012835, 158.40440712], [155.04043289, 104.3499231, 195.26228855]]) >>> a @ c # Comenzando con Python 3.5 y Num 1.10 matriz ([[53.61964114, 38.8741616, 71.53462537], [118.4935668, 86.14012835, 158.40440712], [155.04043289, 104.3499231, 195.26228855]])
- Tensores
>>> M = np . ceros ( forma = ( 2 , 3 , 5 , 7 , 11 )) >>> T = np . transponer ( M , ( 4 , 2 , 1 , 3 , 0 )) >>> T . forma (11, 5, 3, 7, 2)
- Incorporación con OpenCV
>>> importar numpy como np >>> importar cv2 >>> r = np . reshape ( np . arange ( 256 * 256 ) % 256 , ( 256 , 256 )) # matriz de píxeles 256x256 con un degradado horizontal de 0 a 255 para el canal de color rojo >>> g = np . zeros_like ( r ) # matriz del mismo tamaño y tipo que r pero llena de 0 para el canal de color verde >>> b = r . T # transpuesto r dará un gradiente vertical para el canal de color azul >>> cv2 . imwrite ( 'gradients.png' , np . dstack ([ b , g , r ])) # Las imágenes OpenCV se interpretan como BGR, la matriz apilada en profundidad se escribirá en un archivo PNG RGB de 8 bits llamado 'gradients.png' Cierto
- Búsqueda de vecino más cercano: algoritmo de Python iterativo y versión vectorizada de NumPy
>>> # # # Python iterativo puro # # # >>> puntos = [[ 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 = [ 4 , 5 , 3 ] >>> minIdx = - 1 >>> minDist = - 1 >>> para idx , punto en enumerar ( puntos ): # iterar sobre todos los puntos ... dist = sum ([ ( dp - dq ) ** 2 para dp , dq en zip ( point , qPoint )]) ** 0.5 # calcula la distancia euclidiana para cada punto a q ... si dist < minDist o minDist < 0 : # si es necesario, actualizar la distancia mínima y el índice del punto correspondiente ... minDist = dist ... minIdx = idx>>> print ( 'Punto más cercano a q: {0} ' . formato ( puntos [ minIdx ])) Punto más cercano a q: [3, 4, 4]>>> # # # Vectorización NumPy equivalente # # # >>> importar numpy como np >>> puntos = 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 = np . matriz ([ 4 , 5 , 3 ]) >>> minIdx = np . argmin ( np . linalg . norm ( puntos - qPunto , eje = 1 )) # calcula todas las distancias euclidianas a la vez y devuelve el índice de la más pequeña >>> print ( 'Punto más cercano a q: {0} ' . formato ( puntos [ minIdx ])) Punto más cercano a q: [3 4 4]
Ver también
- Programación de matrices
- Lista de software de análisis numérico
Referencias
- ^ "Lanzamientos - numpy / numpy" . Consultado el 8 de febrero de 2021 , a través de GitHub .
- ^ "NumPy - NumPy" . numpy.org . Desarrolladores NumPy.
- ^ Pine, David (2014). "Recursos de Python" . Universidad de Rutgers . Consultado el 7 de abril de 2017 .
- ^ "¿Cómo se dice numpy?" . Reddit. 2015 . Consultado el 7 de abril de 2017 .
- ^ a b 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) . Naturaleza . 585 (7825): 357–362. doi : 10.1038 / S41586-020-2649-2 . ISSN 1476-4687 . PMC 7759461 . PMID 32939066 . Wikidata Q99413970 .
- ^ "Indexación - Manual de NumPy v1.20" . numpy.org . Consultado el 6 de abril de 2021 .
- ^ a b c Millman, K. Jarrod; Aivazis, Michael (2011). "Python para científicos e ingenieros" . Computación en Ciencias e Ingeniería . 13 (2): 9-12. Código bibliográfico : 2011CSE .... 13b ... 9M . doi : 10.1109 / MCSE.2011.36 . Archivado desde el original el 19 de febrero de 2019 . Consultado el 7 de julio de 2014 .
- ^ Travis Oliphant (2007). "Python para la informática científica" (PDF) . Computación en Ciencias e Ingeniería . Archivado desde el original (PDF) el 14 de octubre de 2013 . Consultado el 12 de octubre de 2013 .
- ^ a b c d David Ascher; Paul F. Dubois; Konrad Hinsen; Jim Hugunin; Travis Oliphant (1999). "Python numérico" (PDF) .
- ^ a b c d van der Walt, Stéfan; Colbert, S. Chris; Varoquaux, Gaël (2011). "La matriz NumPy: una estructura para el cálculo numérico eficiente". Computación en Ciencias e Ingeniería . IEEE. 13 (2): 22. arXiv : 1102.1523 . Código bibliográfico : 2011CSE .... 13b..22V . doi : 10.1109 / MCSE.2011.37 . S2CID 16907816 .
- ^ "Página de inicio de Numarray" . Consultado el 24 de junio de 2006 .
- ^ Travis E. Oliphant (7 de diciembre de 2006). Guía de NumPy . Consultado el 2 de febrero de 2017 .
- ^ Travis Oliphant y otros desarrolladores de SciPy. "[Numpy-discusión] Estado de numérico" . Consultado el 2 de febrero de 2017 .
- ^ "Archivos de NumPy Sourceforge" . Consultado el 24 de marzo de 2008 .
- ^ "History_of_SciPy - Volcado de wiki de SciPy" . scipy.github.io .
- ^ "Notas de la versión de NumPy 1.5.0" . Consultado el 29 de abril de 2011 .
- ^ "Blog de estado de PyPy: actualización de estado y financiación de NumPy" . Consultado el 22 de diciembre de 2011 .
- ^ "Estado NumPyPy" . Consultado el 14 de octubre de 2013 .
- ^ La comunidad SciPy. "NumPy para usuarios de Matlab" . Consultado el 2 de febrero de 2017 .
- ^ "Blaze Ecosystem Docs" . Lea los documentos . Consultado el 17 de julio de 2016 .
- ^ Francesc Alted. "numexpr" . Consultado el 8 de marzo de 2014 .
- ^ "Numba" . Consultado el 8 de marzo de 2014 .
- ^ Shohei Hido - CuPy: una biblioteca compatible con NumPy para GPU - PyCon 2018 , consultado el 11 de mayo de 2021
- ^ Entschev, Peter Andreas (23 de julio de 2019). "Aceleraciones de CuPy de una GPU" . Medio . Consultado el 11 de mayo de 2021 .
Otras lecturas
- Bressert, Eli (2012). Scipy y Numpy: una descripción general para desarrolladores . O'Reilly. ISBN 978-1-4493-0546-8.
- McKinney, Wes (2017). Python para el análisis de datos: lucha de datos con Pandas, NumPy e IPython (2ª ed.). Sebastopol: O'Reilly. ISBN 978-1-4919-5766-0.
- VanderPlas, Jake (2016). "Introducción a NumPy". Manual de ciencia de datos de Python: herramientas esenciales para trabajar con datos . O'Reilly. págs. 33–96. ISBN 978-1-4919-1205-8.
enlaces externos
- Página web oficial
- Historia de NumPy