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

まず、ベクトル化計算を使用してみてください。

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 に答える