我有一个200 x 200的图像阵列。我想为每个20 x 20块生成一个坐标对列表,直到数组结束。
要从网格生成坐标对是直截了当的,但我仍然坚持如何迭代数组中的20 x 20块。我是numpy和数组的新手。
w, h = 300, 200
coordinates = [(x, y) for x in xrange(w) for y in xrange(h)]
答案 0 :(得分: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)]
返回与其他所有其他相同的内容,我只是想以此为例。
答案 1 :(得分:0)
如果我理解正确的话。
w, h = 300, 200
coordinates = [(x,y) for x in xrange(0, w, 20) for y in xrange(0, h, 20)]
答案 2 :(得分: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)