我需要遍历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秒钟。 (酷睿i7,8GB内存) 是否有更快的方法使用内部'if'语句执行此循环?我只对超过一定限度的像素感兴趣,但我确实需要它们的(x,y)索引和值。
答案 0 :(得分:17)
使用布尔矩阵:
x, y = (image > limit).nonzero()
vals = image[x, y]
答案 1 :(得分:8)
首先,尝试使用矢量化计算:
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代码一样快。