如何加速';对于循环';用于在python中搜索图像中的像素值?

如何加速';对于循环';用于在python中搜索图像中的像素值?,python,for-loop,numpy,Python,For Loop,Numpy,我用Python编写了以下代码,用于查找160x160图像中每个像素的值,并记录观察到的特定强度的值 def red_finder(img,fname): resolution=img.shape reds=[] #array to add intensity pixels centre=np.divide(resolution,2) for y in range(resolution[1]): for x in range(resolution[0]): #print img

我用Python编写了以下代码,用于查找160x160图像中每个像素的值,并记录观察到的特定强度的值

def red_finder(img,fname):
resolution=img.shape
reds=[] #array to add intensity pixels

centre=np.divide(resolution,2)
for y in range(resolution[1]):
    for x in range(resolution[0]):
    #print img[x,y]
        if np.all(img[x,y]!=0):
            reds.append([x,y])
reds=np.array(reds)
(redx,redy)=(np.mean(reds,axis=0))
proc=(np.mean(reds,axis=0))
xray=proc-centre
return (xray[1],xray[0])
我想,

for y in range(resolution[1]):
    for x in range(resolution[0]):
#print img[x,y]
    if np.all(img[x,y]!=0):
        reds.append([x,y])
这种扫描每个像素的方法需要花费很多时间

有没有什么解决方案可以加快代码的速度,因为图像大小较大,有时会发生变化


谢谢。

你试过列表理解吗?它们通常比普通循环快一点

reds = [ [x,y] for x in range(resolution[0]) for y in range(resolution[1]) if np.all(img[x,y]!=0) ]
除此之外,
np.all()。它是用C和2写的。它在任何不满足条件的值处停止


如另一个答案所述,您可以更快地使用内置NumPy函数替换整个循环,该函数本机执行相同的操作。

双for循环可以通过调用以下内容来替换:


注意:我相信您的代码意味着
img
有两个维度(否则
proc-center
将引发错误)。因此,
img[x,y]
是一个标量值。所以
np.all(img[x,y]!=0)
img[x,y]!=0

对不起,我忘了提到我已经发表了评论#print img[x,y]谢谢你的这种方法。稍微慢一点。所以我支持unutbu的回答,很好。虽然我发布了另一个答案,但我认为这应该是被接受的答案。美女,它的速度快了100倍。非常感谢。我添加了np.all(img[x,y]!=0),因为在某个地方我试图接受彩色图像。但是,是的,我基本上想要它的灰度。因此,它可以完美地工作。您最好自己尝试加速它,然后发布代码,以便我们可以使用它。这是一个有点精神。
def red_finder(img):
    resolution = img.shape
    centre = np.divide(resolution, 2)
    redx, redy = np.where(img != 0)
    proc = (redx.mean(), redy.mean())
    xray = proc - centre
    return (xray[1], xray[0])