14

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

This is taking an obnoxious ~30 seconds to complete on my computer. ( Core i7, 8GB ram ) Is there a faster way to perform this loop with an interior 'if' statement? I am only interested in pixels above a certain limit, but I do need their (x,y) indices and value.

2 Answers 2

22

Use a boolean matrix:

x, y = (image > limit).nonzero()
vals = image[x, y]
Sign up to request clarification or add additional context in comments.

5 Comments

WOW! My eyes are opened. Took < 0.1 second.
what is in x and y here?
@AndrewHundt: x and y are arrays of x- and y-indices for the nonzero points, respectively.
When I run this code with python 2.7, I get an Attribute error saying " 'bool' object has no attribute 'nonzero' ". What is the portion (image > limit) supposed to do?
Either one of image or limit must be a NumPy array - if they are both non-NumPy objects, image > limit will probably resolve to a Python boolean instead of a NumPy boolean array.
7

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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.