Pergunta

Se você estiver criando uma matriz 1d em Python há qualquer benefício de usar o pacote NumPy?

Foi útil?

Solução

Tudo depende do que você pretende fazer com a matriz. Se tudo que você está fazendo é criar matrizes de tipos de dados simples e fazendo I / O, a matriz módulo vai fazer muito bem.

Se, por outro lado, você quer fazer qualquer tipo de cálculos numéricos, o módulo de conjunto não fornece qualquer ajuda com isso. NumPy (e SciPy ) dar-lhe uma grande variedade de operações entre matrizes e funções especiais que são úteis não só para o trabalho científico, mas para coisas como manipulação de imagem avançado ou em qualquer coisa geral, onde você precisa para realizar cálculos eficientes com grandes quantidades de dados.

Numpy também é muito mais flexível, por exemplo, ele suporta matrizes de qualquer tipo de objetos Python, e também é capaz de interagir "nativamente" com seus próprios objetos, se eles estão em conformidade com o interface de série .

Outras dicas

bootstrapping pequeno para o benefício de quem pode encontrar este útil (após a excelente resposta 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

A saída dá:

%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 é ligeiramente mais rápido ea 'api' poupa-lhe alguns problemas, mas se você precisa de mais do que apenas armazenar duplos então numpy.resize não é uma má escolha depois de tudo (se usado corretamente).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top