Python for 循环:执行第二行覆盖第一行创建的对象
Python for loop: executing second line overwrites object created in first line
我是 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)
我希望得到一个与我的图像 im
相同的对象 y
,以及一个与 im
和 [= 具有相同尺寸的对象 dy
12=] 但包含表示像素强度沿图像垂直方向的一阶导数的值。
相反,我看到 dy
已被正确计算,但 y
已被与 dy
相同的值覆盖。为什么对象 y
被覆盖了?
澄清一下:我的原图是"uint8"类型的,无法区分。我必须转换为 "int32" 才能计算导数。在 np.random.randint()
的情况下,示例图像已经在 int32
中。因此,在提供的示例中不需要创建对象 y
,但我需要它来对我的图像切片求导。
您遇到了复制问题。我第一次看到这个也很困惑!如果您查看 empty
,您会发现它也包含与 y
和 dy
.
相同的值
要解决此问题,您需要将代码更改为:
empty = np.zeros([im.shape[0],im.shape[1]])
y = empty.copy()
dy = empty.copy()
当你定义empty
时,在内存中创建一个对象,empty
指向这个对象。
当您设置 y = empty
和 dy = empty
时,不会在内存中创建新数组; y
和 dy
只是指向同一个数组的指针!所以现在 y
、dy
和 empty
都指向同一个对象。
因此,修改 y
、dy
或 empty
中的任何一个都会导致它们全部更改。
我是 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)
我希望得到一个与我的图像 im
相同的对象 y
,以及一个与 im
和 [= 具有相同尺寸的对象 dy
12=] 但包含表示像素强度沿图像垂直方向的一阶导数的值。
相反,我看到 dy
已被正确计算,但 y
已被与 dy
相同的值覆盖。为什么对象 y
被覆盖了?
澄清一下:我的原图是"uint8"类型的,无法区分。我必须转换为 "int32" 才能计算导数。在 np.random.randint()
的情况下,示例图像已经在 int32
中。因此,在提供的示例中不需要创建对象 y
,但我需要它来对我的图像切片求导。
您遇到了复制问题。我第一次看到这个也很困惑!如果您查看 empty
,您会发现它也包含与 y
和 dy
.
要解决此问题,您需要将代码更改为:
empty = np.zeros([im.shape[0],im.shape[1]])
y = empty.copy()
dy = empty.copy()
当你定义empty
时,在内存中创建一个对象,empty
指向这个对象。
当您设置 y = empty
和 dy = empty
时,不会在内存中创建新数组; y
和 dy
只是指向同一个数组的指针!所以现在 y
、dy
和 empty
都指向同一个对象。
因此,修改 y
、dy
或 empty
中的任何一个都会导致它们全部更改。