二维可变迭代器/生成器

1 投票
1 回答
734 浏览
提问于 2025-04-16 12:56

我有一个 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循环获取。

撰写回答