2012-10-22 16 views
8

2560x2160 2B sayısal sayı dizisinin her bir pikselinden geçmem gerekiyor (resim). aşağıdaki gibi benim sorunun bir basitleştirilmiş bir versiyonudur: Bu bilgisayarımda tamamlamak için bir iğrenç ~ 30 saniye alıyorPython'daki bir görüntünün her bir pikselinden geçmenin daha hızlı yolu?

import time 
import numpy as np 

t = time.clock() 
limit = 9000 
for (x,y), pixel in np.ndenumerate(image): 
    if(pixel > limit) 
     pass 
tt = time.clock() 
print tt-t 

. (Core i7, 8GB ram) Bu döngüyü bir 'if' ifadesiyle gerçekleştirmek için daha hızlı bir yol var mı? Sadece belirli bir sınırın üzerindeki piksellerle ilgileniyorum, ama onların (x, y) endekslerine ve değerlerine ihtiyacım var.

cevap

13

bir boolean matrisi kullanın:

x, y = (image > limit).nonzero() 
vals = image[x, y] 
+1

WOW! Gözlerim açıldı. <0.1 saniye sürdü. – dinkelk

+0

Burada x ve y'de ne var? –

+1

@AndrewHundt: "x" ve "y", sıfır olmayan noktalar için sırasıyla x ve y dizilerinin dizisidir. – nneonneo

6

Birincisi, kullanmayı deneyin vectorize hesaplama: Sorununuz vectorize hesaplamasıyla çözmek olamıyorsan

i, j = np.where(image > limit) 

, siz döngü hızlanma olabilir :

for i in xrange(image.shape[0]): 
    for j in xrange(image.shape[1]): 
     pixel = image.item(i, j) 
     if pixel > limit: 
      pass 

ya:

from itertools import product 
h, w = image.shape 
for pos in product(range(h), range(w)): 
    pixel = image.item(pos) 
    if pixel > limit: 
     pass 

Numpy.inenumerate normaldir, döngü için normaldir ve dizideki değeri item yöntemiyle elde edin, döngüyü 4x kadar hızlandırabilirsiniz.

Daha fazla hıza ihtiyacınız varsa, Cython'u kullanmayı deneyin, kodunuzu C kodu kadar hızlı yapar.

İlgili konular