2D可变迭代器/发生器

时间:2011-03-03 17:48:50

标签: python image iterator numpy generator

我有一个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 个答案:

答案 0 :(得分:2)

与任何包含numpy数组的变量一样,要更改“指向”的值,您要避免分配给变量,但要分配给它的一个切片。试试这个:

for submat in output_im_it:
     submat[:] = np.random.random(patch_size)

作为对你的编辑的回应:似乎你把生成器对象与它产生的值混淆了。您无法分配生成器对象本身的切片。您可以分配到numpy数组的切片,您可以使用例如output_im_it.next()或带有for循环,如上所述。