2

画像から 300 x 200 の 2 次元配列があります。配列の最後まで、20 x 20 チャンクごとに座標ペアのリストを生成したいと思います。

グリッドから座標ペアを生成するのは簡単ですが、配列内の 20 x 20 チャンクを反復する方法に行き詰まっています。私はnumpyと配列が初めてです。

w, h = 300, 200
coordinates = [(x, y) for x in xrange(w) for y in xrange(h)]
4

3 に答える 3

1

元の配列を繰り返し処理したい場合は、次のようにすることができます。

w,h = 6,4
n = 2                   #Height of window
m = 2                   #Width of window
k = h / n               #Must divide evenly
l = w / m               #Must divide evenly

data = np.random.randint(0,90,(h,w))
data
[[45 39 36 25 30 21]
 [48 27 46 48 20 87]
 [19 20 59 27 41 52]
 [52 11 42 30 85 49]]

for h in xrange(k):
    for w in xrange(l):
        print data[h*n:(h+1)*n,w*m:(w+1)*m]


[[45 39]
 [48 27]]
[[36 25]
 [46 48]]
[[30 21]
 [20 87]]

[[19 20]
 [52 11]]
[[59 27]
 [42 30]]
[[41 52]
 [85 49]]

ループの順序を切り替えて、異なるウィンドウを最初に発生させることができます。

すべてのインデックスを事前に生成することもできます。

inds = np.arange(w*h).reshape(k,n,l,m).swapaxes(1,2).reshape(k,l,n*m)
#The final reshape can be reshape(k*l,n*m) if you do not want a double loop. 

for h in xrange(k):
    for w in xrange(l):
        print np.take(data,inds[h,w])

[45 39 48 27]
[36 25 46 48]
[30 21 20 87]
[19 20 52 11]
[59 27 42 30]
[41 52 85 49]

次のオプションもあります。

[np.split(x,k,axis=0) for x in np.split(data,l,axis=1)]

[[array([[45, 39],
       [48, 27]]), 
array([[19, 20],
       [52, 11]])], 
[array([[36, 25],
       [46, 48]]), 
array([[59, 27],
       [42, 30]])], 
[array([[30, 21],
       [20, 87]]), 
array([[41, 52],
       [85, 49]])]]

上記の出力順序を切り替えたことに注意してください。次を使用できます。

[np.split(x,l,axis=1) for x in np.split(data,k,axis=0)]

他のすべてと同じように返すには、これを例として挙げたかっただけです。

于 2013-10-12T16:05:38.657 に答える
0

次のコードは、totalList各要素自体が特定の 20x20 ブロック内のすべての座標のリストであるリストを生成します。必要に応じて、これを別のリスト内包表記に減らすことができますが、個人的には、それはあまり読みやすいとは思いません。

w, h = 300, 200
blockSize = 20
totalList = []

for xStart in xrange(0, w, blockSize):
    xEnd = min(xStart+blockSize, w)
    for yStart in range(0, h, blockSize):
        yEnd = min(yStart+blockSize, h)
        partCoords = [(x,y) for x in xrange(xStart, xEnd) for y in xrange(yStart, yEnd)]
        totalList.append(partCoords)
于 2013-10-12T14:02:48.697 に答える
0

私が正しく理解していれば。

w, h = 300, 200
coordinates = [(x,y) for x in xrange(0, w, 20) for y in xrange(0, h, 20)]
于 2013-10-12T12:55:51.413 に答える