【问题标题】:Python for loop: executing second line overwrites object created in first linePython for循环:执行第二行覆盖在第一行创建的对象
【发布时间】:2019-07-07 19:51:58
【问题描述】:

我是 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,以及一个与imy 具有相同尺寸但包含表示像素一阶导数的值的对象dy沿图像垂直方向的强度。

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

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

【问题讨论】:

  • 什么是diff

标签: python object for-loop overwrite


【解决方案1】:

您遇到了复制问题。第一次看到这个,我也很困惑!如果您查看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 中的任何一个都会导致它们都发生变化。

【讨论】:

  • 非常有意义!谢谢。
猜你喜欢
  • 2019-06-27
  • 2019-01-05
  • 1970-01-01
  • 2015-01-24
  • 1970-01-01
  • 1970-01-01
  • 2019-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多