2013-05-16 12 views
5

Ho una grande matrice tridimensionale in numpy (diciamo dimensione 100x100x100). Mi piacerebbe ripetere più volte solo alcune parti di esso (circa il 70% degli elementi) e ho una matrice booleana che ha le stesse dimensioni e definisce se l'elemento deve avere l'operazione eseguita o meno.Come velocizzare l'iterazione su parte di un array numpy

mio metodo attuale è alla prima di creare un array "coordinate" di forma (N, 3) che contiene tutte le coordinate su cui eseguire l'operazione e quindi

for i in np.arange(many_iterations): 
    for j in coords: 
     large_array[j] = do_something(large_array[tuple(j)]) 

Sarebbe infatti essere meglio per valutare l'intero array e includere un'operazione extra nel ciclo per testare l'array booleano (tenere presente che la valutazione della verità viene eseguita più volte in più volte anziché una sola volta). Il mio pensiero era che il pay off in questo caso sarebbe sbarazzarsi del cicli for

large_array = do_something(large_array if condition True) 

Come sarebbe questa ultima linea essere effettuato a lavorare in questo caso?

+0

A seconda di cosa sia "do_qualcosa", potresti essere in grado di eseguire 'large_array [boolean_array] = do_something (large_array [boolean_array])' o qualcosa di più breve ancora. –

+0

Penso che il tuo sentimento sia corretto, potrebbe essere a tuo vantaggio fare l'operazione sull'intero array e quindi usare qualcosa come "nump.where". –

risposta

3

Si potrebbe ottenere una migliore performance creando prima una serie di booleani che definiscono dove si dovrebbe operare:

big_3d_arr = some 100x100x100 array 
where_to_operate_arr = big_3d_arr < 500 # or whatever your condition is 
big_3d_arr[where_to_operate_arr] = do_something(big_3d_arr[where_to_operate_arr]) 

Qualcosa del genere potrebbe funzionare, ma ancora una volta potrebbe essere necessario scorrere e fare l'indicizzazione booleano in blocchi , a seconda dell'applicazione.

+0

Grazie, questo è esattamente ciò di cui avevo bisogno. do_something è una funzione che ottiene ogni elemento dell'array e ne fa la media degli elementi circostanti (per fare ciò copio l'array e poi utilizzo una serie di np.roll per spostare l'array e aggiungere). Alla fine ho deciso di non utilizzare le maschere visto che sto ancora utilizzando i dati mascherati e mi è sembrato un po 'più complicato di questa soluzione. – Rowan

Problemi correlati