二维可变迭代器/生成器
我有一个 NxN 的矩阵,我想把它分成不重叠的 KxK 小块。对于每个小块,我想给里面的元素赋新值。
因为这看起来适合用生成器来处理,所以我实现了:
def extracted_patches(im, top_left, patch_size, grid_size):
'''Extract patches in row-major order following a specific configuration
Parameters
----------
im : the input image (2D numpy array)
top_left : (y,x) coordinate of the top left point (e.g. (3,5))
grid_size : (cy, cx) how many patches in the y-direction and in the x-direction
patch_size : (h, w) how many pixels for the size of each patch
Returns
-------
a generator that goes through each patch (a numpy array view) in row-major order
'''
for i in xrange(grid_size[0]):
for j in xrange(grid_size[1]):
yield im[top_left[0] + patch_size[0]*i : top_left[0] + patch_size[0]*(i+1)
,top_left[1] + patch_size[1]*j : top_left[1] + patch_size[1]*(j+1)]
但是当我尝试改变每个小块的值时,赋值操作改变的是变量的值,而不是生成器提供的值。
output_im = np.zeros((patch_size[0]*grid_size[0], patch_size[1]*grid_size[1]))
output_im_it = extracted_patches(output_im, (0,0), patch_size, grid_size)
for i in xrange(grid_size[0]*grid_size[1]):
output_im_it = np.random.random(patch_size)
我的生成器可以是可变的吗?
1 个回答
2
和任何保存了numpy数组的变量一样,如果你想改变“指向”的值,最好不要直接给变量赋值,而是给它的一部分(切片)赋值。试试这个:
for submat in output_im_it:
submat[:] = np.random.random(patch_size)
关于你编辑后的回复:看起来你把生成器对象和它产生的值搞混了。你不能给生成器对象本身的切片赋值。你可以给numpy数组的切片赋值,这些数组可以通过例如output_im_it.next()
或者像上面那样用for循环获取。