14

我需要遍历 2560x2160 2D numpy 数组(图像)的每个像素。我的问题的简化版本如下:

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

在我的电脑上完成这需要大约 30 秒的时间。(Core i7,8GB ram)有没有更快的方法来使用内部“if”语句来执行这个循环?我只对超过一定限制的像素感兴趣,但我确实需要它们的 (x,y) 索引和值。

4

2 回答 2

22

使用布尔矩阵:

x, y = (image > limit).nonzero()
vals = image[x, y]
于 2012-10-22T01:31:53.480 回答
7

首先,尝试使用vectorize计算:

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

如果您的问题不能通过矢量化计算来解决,您可以加速 for 循环:

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

或者:

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.ndenumerate 很慢,通过使用普通的 for 循环并通过item方法从数组中获取值,您可以将循环速度提高 4 倍。

如果您需要更快的速度,请尝试使用 Cython,它将使您的代码与 C 代码一样快。

于 2012-10-22T02:02:09.930 回答