I need to loop through each pixel of a 2560x2160 2D numpy array (image). A simplified version of my problem is as follows:
import time
import numpy as np
t
Use a boolean matrix:
x, y = (image > limit).nonzero()
vals = image[x, y]
First, try to use vectorize calculation:
i, j = np.where(image > limit)
If your problem can't be solve by vectorize calculation, you can speedup the for loop as:
for i in xrange(image.shape[0]):
for j in xrange(image.shape[1]):
pixel = image.item(i, j)
if pixel > limit:
pass
or:
from itertools import product
h, w = image.shape
for pos in product(range(h), range(w)):
pixel = image.item(pos)
if pixel > limit:
pass
The numpy.ndenumerate is slow, by using normal for loop and get the value from array by item
method you can speedup the loop by 4x.
If you need more speed, try to use Cython, it will make your code as fast as C code.