我有一个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)
我的发电机可以变异吗?
答案 0 :(得分:2)
与任何包含numpy数组的变量一样,要更改“指向”的值,您要避免分配给变量,但要分配给它的一个切片。试试这个:
for submat in output_im_it:
submat[:] = np.random.random(patch_size)
作为对你的编辑的回应:似乎你把生成器对象与它产生的值混淆了。您无法分配生成器对象本身的切片。您可以分配到numpy数组的切片,您可以使用例如output_im_it.next()
或带有for循环,如上所述。