Python for循环:执行第二行会覆盖在第一行中创建的对象

问题描述 投票:0回答:1

我是Python新手,希望使用for循环来分析图像的垂直切片。当每个单独的行独立执行时,我的for循环工作。但是,当一起执行时,在第一行中创建的对象将采用在第二行中创建的对象的值。

# create image of random noise 
im = np.random.randint(0,255,(100,200)) 

# create empty y and dy objects with same size as original image
empty = np.zeros([im.shape[0],im.shape[1]])
y = empty
dy = empty

# get pixel intensities in vertical strips, and then take first derivative 
for i in xrange(im.shape[1]):
    y[:,i] = im[:,i].astype(np.int32) 
    dy[:,i] = np.insert(diff(y[:,i]),0,0) 

我期望得到一个与我的图像y相同的对象im,以及与dyim具有相同尺寸的对象y,但包含表示沿图像垂直方向的像素强度的一阶导数的值。

相反,我看到dy已被正确计算,但y已被覆盖与dy相同的值。为什么对象y被覆盖?

澄清一下:我的原始图像是“uint8”类型,无法区分。我必须转换为“int32”来计算导数。在np.random.randint()的情况下,示例图像已经在int32中。因此,在提供的示例中,对象y的创建是不必要的,但是我需要它来获取图像切片的衍生物。

python object for-loop overwrite
1个回答
2
投票

你有副本问题。我第一次看到它也让我很困惑!如果你看看empty,你会发现它也包含与ydy相同的值。

要解决此问题,您需要将代码更改为:

empty = np.zeros([im.shape[0],im.shape[1]])
y = empty.copy()
dy = empty.copy()

定义empty时,会在内存中创建一个对象,并且empty指向此对象。

设置y = emptydy = empty时,不会在内存中创建新数组; ydy只是指向同一阵列的指针!所以现在你有ydyempty都指向同一个对象。

所以,修改ydyempty中的任何一个都会导致所有这些变化。

© www.soinside.com 2019 - 2024. All rights reserved.