Pergunta
Se você estiver criando uma matriz 1d em Python há qualquer benefício de usar o pacote NumPy?
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).