[英]Faster way to loop through every pixel of an image in Python?
我需要遍歷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)索引和值。
使用布爾矩陣:
x, y = (image > limit).nonzero()
vals = image[x, y]
首先,嘗試使用矢量化計算:
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很慢,通過使用normal for循環並從item
方法獲取值,您可以將循環加速4倍。
如果你需要更高的速度,嘗試使用Cython,它將使你的代碼與C代碼一樣快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.