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. Indexación numpy.array unidimensional como matriz
- 4. eliminando datos de un numpy.array
- 5. Cómo eliminar columnas en numpy.array
- 6. pymssql versus pyodbc versus adodbapi versus ...
- 7. ¿Por qué numpy.array es tan lento?
- 8. Iteración sobre la dimensión arbitraria de numpy.array
- 9. _Expand versus new versus GNU
- 10. Control.ResolveUrl versus Control.ResolveClientUrl versus VirtualPathUtility.ToAbsolute
- 11. metaphone versus soundex versus NYSIIS
- 12. zend-framework versus Kohana versus Symfony
- 13. numpy.array de un archivo de imagen "I; 16"
- 14. ¿Cuál es la mejor manera de afirmar la igualdad numpy.array?
- 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. Zend_Validate_EmailAddress versus filter_var (..., FILTER_VALIDATE_EMAIL)
- 20. R: entero versus numérico
- 21. EJS: <% = versus <% -
- 22. AesManaged versus RijndaelManaged
- 23. apc_add() versus apc_store()
- 24. timeit versus timing decorator
- 25. Rails current_page? versus controller.controller_name
- 26. union versus void pointer
- 27. "REEMPLAZAR" versus INSERTAR [SI]
- 28. @ "" versus [cadena NSString]
- 29. viewDidUnload versus viewDidDisappear
- 30. @XMLRootElement versus @XmlType
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