2013-05-16 15 views
5

Mam dużą trójwymiarową tablicę w numpy (powiedzmy rozmiar 100x100x100). Chciałbym iterować po prostu jego części wiele razy (około 70% elementów) i mam macierz logiczną, która ma ten sam rozmiar i określa, czy element powinien mieć operację wykonaną czy nie.Jak przyspieszyć iterację na części tablicy numpy

My obecny sposób jest najpierw utworzyć macierz „coords” kształtu (n = 3), który zawiera wszystkie współrzędnymi na ich wykonanie operacji, a następnie

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

Byłoby w rzeczywistości lepiej aby ocenić całą tablicę i dodać dodatkową operację w pętli, aby przetestować tablicę logiczną (pamiętaj, że ocena prawdy jest wykonywana wielokrotnie razy, a nie raz). Moja myśl była, że ​​opłacać w tym przypadku byłoby pozbycie się pętle

large_array = do_something(large_array if condition True) 

Jak będzie to ostatnia linia być wykonane do pracy w tym przypadku?

+0

W zależności od tego, czym jest 'do_something', możesz być w stanie zrobić' large_array [boolean_array] = do_something (large_array [boolean_array]) 'lub coś jeszcze krótszego. –

+0

Myślę, że twój sentyment jest właściwy, może to być dla ciebie korzystne, aby wykonać operację na całej tablicy, a następnie użyć czegoś takiego jak "numpy.where". –

Odpowiedz

3

Można uzyskać lepszą wydajność, najpierw tworząc tablicę wartości logiczne, które określają, gdzie trzeba działać:

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

Coś takiego może działać, ale znowu może trzeba iteracyjne i zrobić logiczną indeksowanie w kawałkach , w zależności od aplikacji.

+0

Dzięki temu jest dokładnie to, czego potrzebowałem. do_something jest funkcją, która pobiera każdy element tablicy i czyni ją średnią z otaczających elementów (w tym celu kopiuję tablicę, a następnie używając serii np.roll, aby przesunąć tablicę i dodać). W końcu zdecydowałem się na maskowanie, ponieważ wciąż używam zamaskowanych danych i wydawało mi się to nieco bardziej skomplikowane niż to rozwiązanie. – Rowan