2014-09-03 14 views
6

Ho una matrice NumPy e posso semplicemente aggiungere un elemento ad esso utilizzando accodamento, in questo modo:modo ottimale da aggiungere a matrice NumPy

numpy.append(myarray, 1) 

In questo caso ho appena allegate il numero intero 1.

Ma è questo il modo più rapido per aggiungere un array? Ho una matrice molto lunga che va a decine di migliaia.

Oppure è meglio indicizzare l'array e assegnarlo direttamente? Ti piace questa:

myarray[123] = 1 

risposta

9

Aggiunta di array NumPy è molto inefficiente. Questo perché l'interprete deve trovare e assegnare memoria all'intero array in ogni singolo passaggio. A seconda dell'applicazione, ci sono strategie molto migliori.

Se si conosce la lunghezza in anticipo, è meglio pre-allocare l'array utilizzando una funzione come np.ones, np.zeros o np.empty.

desired_length = 500 
results = np.empty(desired_length) 
for i in range(desired_length): 
    results[i] = i**2 

Se non si conosce la lunghezza, è probabilmente più efficace per mantenere i risultati in una lista regolare e convertirlo in una matrice in seguito.

results = [] 
while condition: 
    a = do_stuff() 
    results.append(a) 
results = np.array(results) 

Ecco alcuni tempi sul mio computer.

def pre_allocate(): 
    results = np.empty(5000) 
    for i in range(5000): 
     results[i] = i**2 
    return results 

def list_append(): 
    results = [] 
    for i in range(5000): 
     results.append(i**2) 
    return np.array(results) 

def numpy_append(): 
    results = np.array([]) 
    for i in range(5000): 
     np.append(results, i**2) 
    return results 

%timeit pre_allocate() 
# 100 loops, best of 3: 2.42 ms per loop 

%timeit list_append() 
# 100 loops, best of 3: 2.5 ms per loop 

%timeit numpy_append() 
# 10 loops, best of 3: 48.4 ms per loop 

Quindi è possibile vedere che sia la pre-allocazione che l'utilizzo di un elenco, quindi la conversione sono molto più veloci.

1

Se si conosce la dimensione dell'array alla fine della corsa, sarà molto più veloce pre-allocare un array della dimensione appropriata e quindi impostare i valori. Se è necessario aggiungere al volo, è probabilmente meglio provare a non eseguire questo elemento alla volta, aggiungendo invece il numero di volte il più possibile per evitare di generare molte copie più e più volte. Si potrebbe anche voler fare un po 'di profilazione della differenza di tempo di np.append, np.hstack, np.concatenate. ecc.

Problemi correlati