2013-05-16 23 views
5

Numune olarak büyük boyutlu 3 boyutlu bir dizim var (boyut 100x100x100 diyelim). Bir çok parçasını (elementlerin yaklaşık% 70'i) birkaç kez yinelemek istiyorum ve aynı büyüklükte bir boole matrisine sahibim ve elemanın işlemi yapıp yapmaması gerektiğini tanımlar.Sayısal dizinin bir kısmı boyunca yineleme nasıl hızlandırılır

Benim geçerli yöntem şeklinin bir dizi "Coords" (N, 3) bir işlem yapmak için ve daha sonra

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

aslında daha iyi olurdu ki tüm Coords içeren oluşturmak için ilk için tüm diziyi değerlendirmek ve boole dizisini sınamak için döngüde fazladan bir işlem eklemek için (gerçeği değerlendirmenin daha sonra bir defadan ziyade many_itrasyon kez yapıldığı unutulmamalıdır). Benim düşünce bu durumda ödeme kapalı bu son satır bu durumda işe yapılmış olacağını nasıl döngüler

large_array = do_something(large_array if condition True) 

için kurtulmak olacağını idi?

+0

'do_something' ifadesine bağlı olarak, 'large_array [boolean_array] = do_something (large_array [boolean_array])' ya da daha kısa bir şey yapabilirsiniz. –

+0

Düşüncenin doğru olduğunu düşünüyorum, tüm dizide işlemi yapmak ve ardından 'nümtop' gibi bir şey kullanmak sizin yararınıza olabilir. –

cevap

3

Önce sektörün nerelerde tanımlayan boole dizisi oluşturarak daha iyi performans elde edebilirsiniz:

böyle
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]) 

şey çalışabilir, ancak yine yinelemek zorunda ve topaklar halinde boole indeksleme yapabilir uygulamanıza bağlı olarak.

+0

Teşekkürler bu tam olarak ihtiyacım olan şey. do_something, dizinin her bir öğesini alan ve onu çevreleyen öğelerin ortalamasını yapan bir işlevdir (diziyi kopyalamak ve diziyi dengelemek için bir dizi np.roll kullanmak ve eklemek). Maskelenmiş veriyi hala kullanmaya devam ettiğimden beri maskelere karşı karar verdim ve bu çözümden biraz daha karmaşık görünüyordu. – Rowan

İlgili konular