Domanda

Se stai creando un array 1d in Python, ci sono dei vantaggi nell'usare il pacchetto NumPy?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top