Python for loop: выполнение второй строки перезаписывает объект, созданный в первой строке - PullRequest
0 голосов
/ 14 февраля 2019

Я новичок в 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 и объект dy, который имеет те же размеры, что и im и y, но содержит значения, представляющие первую производную интенсивности пикселей вдоль вертикального направления изображения.

Вместо этого яубедитесь, что dy был правильно рассчитан, но y был перезаписан значениями, идентичными dy.Почему объект y перезаписывается?

Для пояснения: мое исходное изображение имеет тип "uint8", который нельзя дифференцировать.Я должен преобразовать в "int32", чтобы вычислить производную.В случае np.random.randint() пример изображения уже находится в int32.Таким образом, создание объекта y не является необходимым в представленном примере, но мне нужно, чтобы оно взяло производную от срезов моего изображения.

1 Ответ

0 голосов
/ 14 февраля 2019

У вас проблема с копированием.Первый раз, когда я это увидел, меня это тоже смутило!Если вы посмотрите на 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 вызовет их всехизменить.

...