gpt4 book ai didi

python - 2D 可变迭代器/生成器

转载 作者:行者123 更新时间:2023-12-01 06:12:14 24 4
gpt4 key购买 nike

我有一个 NxN 矩阵,我想将其拆分为非重叠的 KxK block 。对于每个 block ,我想为元素分配新值。

由于这看起来是生成器的好地方,所以我实现了:

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)

我的生成器可以是可变的吗?

最佳答案

与保存 numpy 数组的任何变量一样,要更改“指向”的值,您需要避免分配给该变量,而是分配给它的一个切片。试试这个:

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

作为对您编辑的回应:您似乎将生成器对象与其生成的值混淆了。您不能分配给生成器对象本身的切片。您可以分配给 numpy 数组的切片,您可以使用例如获得output_im_it.next() 或使用 for 循环,如上所述。

关于python - 2D 可变迭代器/生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5184462/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com