2008-09-21 16 views

Respuesta

49

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.

+7

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. –

+1

@ 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

+0

@dF. El enlace al módulo de matriz está muerto. ¿Conoces su nueva ubicación? – Karlo

1

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).