python.array contro numpy.array
Domanda
Se stai creando un array 1d in Python, ci sono dei vantaggi nell'usare il pacchetto NumPy?
Soluzione
Tutto dipende da cosa pensi di fare con l'array. Se tutto ciò che stai facendo è creare array di tipi di dati semplici e eseguire operazioni di I / O, l'array il modulo andrà bene.
Se, d'altra parte, si desidera eseguire qualsiasi tipo di calcolo numerico, il modulo array non fornisce alcun aiuto in tal senso. NumPy (e SciPy ) offre un'ampia gamma di operazioni tra array e funzioni speciali utili non solo per il lavoro scientifico ma per cose come la manipolazione avanzata delle immagini o in generale qualsiasi cosa in cui sia necessario eseguire calcoli efficienti con grandi quantità di dati.
Numpy è anche molto più flessibile, ad es. supporta matrici di qualsiasi tipo di oggetti Python ed è anche in grado di interagire "nativamente" con i tuoi oggetti se sono conformi alla interfaccia array .
Altri suggerimenti
Piccolo bootstrap per il beneficio di chiunque possa trovarlo utile (seguendo l'eccellente risposta di @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
L'output fornisce:
%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
Sembra che array.array sia leggermente più veloce e 'api' ti risparmi un po 'di seccatura, ma se hai bisogno di qualcosa di più della semplice memorizzazione dei doppi, allora numpy.resize non è una cattiva scelta dopo tutto (se usato correttamente).