Si está creando una matriz de 1d en Python, ¿hay algún beneficio al usar el paquete NumPy?python.array versus numpy.array
Respuesta
Todo depende de lo que planeas hacer con la matriz. Si todo lo que hace es crear matrices de tipos de datos simples y hacer E/S, el módulo array funcionará perfectamente.
Si, por otro lado, desea hacer cualquier tipo de cálculos numéricos, el módulo de matriz no proporciona ninguna ayuda con eso. NumPy (y SciPy) le ofrecen una amplia variedad de operaciones entre arreglos y funciones especiales que son útiles no solo para trabajos científicos sino también para la manipulación avanzada de imágenes o, en general, para realizar cálculos eficientes con grandes cantidades de datos.
Numpy es también mucho más flexible, p. admite matrices de cualquier tipo de objetos Python, y también puede interactuar "nativamente" con sus propios objetos si se ajustan al array interface.
Pequeño arranque para el beneficio de todo el que pudiera resultar útil (después de la excelente respuesta por @dF.):
import numpy as np
from array import array
# Fixed size numpy array
def np_fixed(n):
q = np.empty(n)
for i in range(n):
q[i] = i
return q
# Resize with np.resize
def np_class_resize(isize, n):
q = np.empty(isize)
for i in range(n):
if i>=q.shape[0]:
q = np.resize(q, q.shape[0]*2)
q[i] = i
return q
# Resize with the numpy.array method
def np_method_resize(isize, n):
q = np.empty(isize)
for i in range(n):
if i>=q.shape[0]:
q.resize(q.shape[0]*2)
q[i] = i
return q
# Array.array append
def arr(n):
q = array('d')
for i in range(n):
q.append(i)
return q
isize = 1000
n = 10000000
La salida da:
%timeit -r 10 a = np_fixed(n)
%timeit -r 10 a = np_class_resize(isize, n)
%timeit -r 10 a = np_method_resize(isize, n)
%timeit -r 10 a = arr(n)
1 loop, best of 10: 868 ms per loop
1 loop, best of 10: 2.03 s per loop
1 loop, best of 10: 2.02 s per loop
1 loop, best of 10: 1.89 s per loop
Parece que array.array es un poco más rápido y la 'api' te ahorra un poco de molestia, pero si necesitas algo más que almacenar dobles, numpy.resize no es una mala elección después de todo (si se usa correctamente).
- 1. Numpy.array indexing question
- 2. numpy.array booleano a binario?
- 3. eliminando datos de un numpy.array
- 4. Cómo eliminar columnas en numpy.array
- 5. Indexación numpy.array unidimensional como matriz
- 6. pymssql versus pyodbc versus adodbapi versus ...
- 7. Iteración sobre la dimensión arbitraria de numpy.array
- 8. ¿Por qué numpy.array es tan lento?
- 9. metaphone versus soundex versus NYSIIS
- 10. _Expand versus new versus GNU
- 11. Control.ResolveUrl versus Control.ResolveClientUrl versus VirtualPathUtility.ToAbsolute
- 12. zend-framework versus Kohana versus Symfony
- 13. ¿Cuál es la mejor manera de afirmar la igualdad numpy.array?
- 14. numpy.array de un archivo de imagen "I; 16"
- 15. $ versus jQuery
- 16. ArrayList versus una matriz de objetos versus Colección de T
- 17. Equivalente a Numpy.argsort() en python básico?
- 18. log4net versus TraceSource
- 19. JQuery Click versus Change
- 20. C# Assert.AreNotEqual versus Igual
- 21. SOAP versus HTTP
- 22. union versus void pointer
- 23. window.location versus solo ubicación
- 24. attachEvent versus addEventListener
- 25. ConnectionTimeout versus SocketTimeout
- 26. Apio versus djcelery
- 27. Jquery .on versus .live
- 28. Clojure import versus import
- 29. boost lambda versus phoenix
- 30. clave primaria versus clave
En defensa de array.array, creo que es importante tener en cuenta que también es mucho más liviano que numpy.array, y que decir 'irá bien' para una matriz 1D debería ser 'mucho más rápido, más pequeño, y trabaja en pypy/cython sin problemas. ' Me encanta NumPy, pero para arreglos simples, el módulo array.array es realmente mejor. –
@ J.J nunca antes había usado array.array en mi vida, ¿te importaría dar un caso de uso cuando sea significativamente mejor (quizás estoy sobreutilizando np.ndarray)? – VF1
@dF. El enlace al módulo de matriz está muerto. ¿Conoces su nueva ubicación? – Karlo