3

タプルのリストに格納されたインデックスのリストがあります。

index=[(0,0), (0,1), (1,0), (1,1) ....]

imこれらのインデックスは、次の式で画像 (numpy 配列) のエネルギーを計算するために使用されます。

(1-im[0,0])^2+(1-im[0,1])^2+....

imこれは2次元のnumpy配列です。次に例を示しimます。

im=Image.open('lena_noisy.png')
im=numpy.array(im)
print im

[[168 133 131 ..., 127 213 107]
 [174 151 111 ..., 191  88 122]
 [197 173 143 ..., 182 153 125]
 ..., 
 [ 34  15   6 ..., 111  95 104]
 [ 37  15  57 ..., 121 133 134]
 [ 49  39  58 ..., 115  74 107]]

リストのマップ関数を使用してこの計算を実行するにはどうすればよいですか?

4

3 に答える 3

4

index2 つのタプルに分割するとxidxyidxファンシー インデックスを使用してすべてのim値に 1 つの numpy 配列としてアクセスできます。次に、計算は表現が簡単になり、Python ループ (またはリスト内包表記) を実行するよりも高速になります。

import numpy as np
xidx, yidx = zip(*index)
print(((1-im[xidx, yidx])**2).sum())

import numpy as np
import scipy.misc as misc

im = misc.lena()
n = min(im.shape)
index = np.random.randint(n, size = (10000,2)).tolist()

def using_fancy_indexing(index, im):
    xidx, yidx = zip(*index)
    return (((1-im[xidx, yidx])**2).sum())

def using_generator_expression(index, im):
    return sum(((1 - im[i[0], i[1]]) ** 2) for i in index)

timeit を使用した比較は次のとおりです。

In [27]: %timeit using_generator_expression(index, im)
100 loops, best of 3: 17.9 ms per loop

In [28]: %timeit using_fancy_indexing(index, im)
100 loops, best of 3: 2.07 ms per loop

したがって、 のサイズによってはindex、ファンシー インデックスを使用すると、ジェネレーター式を使用するよりも 8 倍高速になる可能性があります。

于 2013-02-06T23:01:05.360 に答える
2

このように、ジェネレータ式を使用します。

sum((1-im[i][j])**2 for i, j in index)

つまり、imは 2 次元リストでindexあり、 は座標のリストであると仮定しimます。Python では、2 次元リストは次のようにアクセスされます:m[i][j]ではなく、次のようにアクセスされることに注意してくださいm[i,j]

于 2013-02-06T22:55:25.717 に答える
1

sumとジェネレーター式を使用する:

sum(((1 - im[i[0], i[1]]) ** 2) for i in index)

index も numpy 配列である場合、配列をインデックスとして使用できます。

sum(((1 - im[i]) ** 2) for i in index)
于 2013-02-06T22:57:59.097 に答える