Копирование массива с оператором '='.Почему это работает? - PullRequest
0 голосов
/ 25 сентября 2019

Согласно этому ответу , B=A, где A - массив пустышек, B должен указывать на тот же объект A.

import cv2
import numpy as np

img = cv2.imread('rose.jpeg')
print("img.shape: ", np.shape(img))

img2 = img
img = cv2.resize(img, (250,100))
print("img.shape: ", img.shape)
print("img2.shape:", img2.shape)

Вывод:

img.shape:  (331, 500, 3)
img.shape:  (100, 250, 3)
img2.shape: (331, 500, 3)

Кажется, это очень простой вопрос, но я ломал голову над этим.Может кто-нибудь объяснить, что происходит за этим?

1 Ответ

1 голос
/ 25 сентября 2019

«Проблема» в том, что вы используете здесь не numpy, а opencv, и хотя numpy array.resize () находится на месте, opencv img.resize () - нет.

Так что ваш вызов

    img = cv2.resize(img, (250,100))

создает новый объект (изображение) с заданным размером.Так что здесь переменная img будет указывать на другой объект, отличный от вызова.

    img2 = img

добавляет новое имя для исходного объекта.Здесь img2 и img ссылаются на один и тот же объект / фрагмент памяти.

    img = cv2.resize(img, (250,100))

cv2.resize(img, (250,100)) создает новый объект, а имя img теперь относится к этому новому объекту / фрагменту памяти.

    print("img.shape: ", img.shape)

возвращает размер нового объектаи

    print("img2.shape:", img2.shape)

размер исходного объекта, поскольку img2 по-прежнему ссылается на исходный объект.

Кстати, в numpy вызов a = a.resize(...) будет действительно плохим - потому что aбудет затем None (возвращаемое значение resize) вместо массива с измененным размером.Там вы просто сделаете a.resize(...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...