multiplicar - transpuesta de una matriz en python numpy
¿Cuáles son las ventajas de NumPy sobre las listas regulares de Python? (5)
¿Cuáles son las ventajas de NumPy sobre las listas regulares de Python?
Tengo aproximadamente 100 series de mercados financieros, y voy a crear una matriz de cubos de 100x100x100 = 1 millón de celdas. Regresaré (3 variables) cada x con cada y y z, para llenar la matriz con errores estándar.
He escuchado que para "matrices grandes" debería usar NumPy en lugar de las listas de Python, por razones de rendimiento y escalabilidad. La cosa es que sé que las listas de Python y parecen funcionar para mí.
¿Cuáles serán los beneficios si me mudo a NumPy?
¿Qué pasa si tuviera 1000 series (es decir, 1 mil millones de celdas de punto flotante en el cubo)?
Alex mencionó la eficiencia de la memoria, y Roberto menciona la conveniencia, y estos son buenos puntos. Para algunas ideas más, mencionaré la velocidad y la funcionalidad .
Funcionalidad: se integra mucho con NumPy, FFT, convoluciones, búsqueda rápida, estadísticas básicas, álgebra lineal, histogramas, etc. Y realmente, ¿quién puede vivir sin FFT?
Velocidad: aquí hay una prueba para hacer una suma sobre una lista y una matriz NumPy, que muestra que la suma en la matriz NumPy es 10 veces más rápida (en esta prueba, el millaje puede variar).
from numpy import arange
from timeit import Timer
Nelements = 10000
Ntimeits = 10000
x = arange(Nelements)
y = range(Nelements)
t_numpy = Timer("x.sum()", "from __main__ import x")
t_list = Timer("sum(y)", "from __main__ import y")
print("numpy: %.3e" % (t_numpy.timeit(Ntimeits)/Ntimeits,))
print("list: %.3e" % (t_list.timeit(Ntimeits)/Ntimeits,))
que en mis sistemas (mientras estoy ejecutando una copia de seguridad) da:
numpy: 3.004e-05
list: 5.363e-04
Aquí hay una buena respuesta de las preguntas frecuentes en el sitio web scipy.org :
¿Qué ventajas ofrecen las matrices NumPy sobre las listas de Python (anidadas)?
Las listas de Python son contenedores de uso general eficientes. Admiten (bastante) la inserción, eliminación, adición y concatenación eficientes, y las listas de comprensión de Python hacen que sean fáciles de construir y manipular. Sin embargo, tienen ciertas limitaciones: no admiten operaciones "vectorizadas" como la adición y multiplicación elementales, y el hecho de que puedan contener objetos de diferentes tipos significa que Python debe almacenar información de tipo para cada elemento y debe ejecutar el código de envío de tipo Al operar sobre cada elemento. Esto también significa que muy pocas operaciones de lista pueden llevarse a cabo por bucles C eficientes: cada iteración requeriría verificaciones de tipo y otra contabilidad de la API de Python.
Las matrices de NumPy son más compactas que las listas de Python: una lista de listas que describe, en Python, tomaría al menos 20 MB aproximadamente, mientras que una matriz NumPy 3D con flotadores de precisión simple en las celdas cabría en 4 MB. El acceso en la lectura y escritura de artículos también es más rápido con NumPy.
Tal vez no le importe mucho solo un millón de celdas, pero definitivamente lo haría por mil millones de celdas; ninguno de estos enfoques cabría en una arquitectura de 32 bits, pero con compilaciones de 64 bits, NumPy se saldría con 4 GB más Python solo necesitaría al menos unos 12 GB (muchos punteros que duplican su tamaño), ¡una pieza de hardware mucho más costosa!
La diferencia se debe principalmente a la "indirectidad": una lista de Python es una matriz de punteros a objetos de Python, al menos 4 bytes por puntero más 16 bytes, incluso para el objeto Python más pequeño (4 para puntero de tipo, 4 para recuento de referencia, 4 para el valor - y los asignadores de memoria se redondean hasta 16). Una matriz NumPy es una matriz de valores uniformes: los números de precisión simple toman 4 bytes cada uno, los de precisión doble, 8 bytes. Menos flexible, ¡pero paga sustancialmente por la flexibilidad de las listas estándar de Python!
NumPy no es solo más eficiente; También es más conveniente. Usted obtiene una gran cantidad de operaciones de vectores y matrices de forma gratuita, que a veces permiten evitar el trabajo innecesario. Y también son implementados eficientemente.
Por ejemplo, puedes leer tu cubo directamente desde un archivo en una matriz:
x = numpy.fromfile(file=open("data"), dtype=float).reshape((100, 100, 100))
Suma a lo largo de la segunda dimensión:
s = x.sum(axis=1)
Encuentra qué celdas están por encima de un umbral:
(x > 0.5).nonzero()
Elimine todos los cortes indexados a lo largo de la tercera dimensión:
x[:, :, ::2]
Además, muchas bibliotecas útiles funcionan con matrices NumPy. Por ejemplo, el análisis estadístico y las bibliotecas de visualización.
Incluso si no tiene problemas de rendimiento, vale la pena aprender NumPy.
Tenga en cuenta también que hay soporte para series temporales basadas en NumPy en los conjuntos de series temporales:
http://pytseries.sourceforge.net
Para la regresión, estoy bastante seguro de que NumPy será órdenes de magnitud más rápido y más conveniente que las listas, incluso para el problema 100 ^ 3.