用'='运算符复制numpy数组。为什么运作?

时间:2019-09-25 07:38:10

标签: python numpy

根据this的答案B=A,其中A是一个numpy数组,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 个答案:

答案 0 :(得分:1)

“问题”是您不是在这里使用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会被Noneresize的返回值)而不是调整大小后的数组。在那里,您只需要a.resize(...)