Pregunta

Si está creando una matriz 1d en Python, ¿hay algún beneficio al usar el paquete NumPy?

¿Fue útil?

Solución

Todo depende de lo que planees hacer con la matriz.Si todo lo que estás haciendo es crear matrices de tipos de datos simples y realizar E/S, el formación El módulo funcionará bien.

Si, por el contrario, desea realizar algún tipo de cálculo numérico, el módulo de matriz no proporciona ninguna ayuda con eso. NumPy (y ciencia ficción) le brindan una amplia variedad de operaciones entre matrices y funciones especiales que son útiles no solo para trabajos científicos sino también para cosas como manipulación avanzada de imágenes o en general cualquier cosa donde necesite realizar cálculos eficientes con grandes cantidades de datos.

Numpy también es mucho más flexible, p.admite matrices de cualquier tipo de objetos Python y también puede interactuar "de forma nativa" con sus propios objetos si se ajustan a las interfaz de matriz.

Otros consejos

Pequeño arranque en beneficio de quien pueda encontrar esto útil (siguiendo la excelente respuesta de @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' le ahorra algunos problemas, pero si necesita algo más que almacenar dobles, numpy.resize no es una mala elección después de todo (si se usa correctamente).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top