python - 为什么我需要 np.array() 或 np.copy()?

标签 python numpy

这里是一个真正 NumPy 的新手问题。

我有一个名为“图像”的 numpy 数组。这样做:

image2 = image
image2[image < minval] = minval
image2[image > maxval] = maxval

...更改“图像”的内容。

我认为这是因为 Python 中的变量实际上是引用,所以“image2”只是引用“image”的另一种方式。所以我应该使用“image2 = np.copy(image)”。很好。

但是,为什么当我这样做时 'a' 没有改变:

a = 5
b = a
b = 7

“b”不就是指代“a”的另一种方式吗?如果是这样,为什么最后没有 a==7?

我想知道是否有某种心理模型可以使这看起来一致。因为它没有。

最佳答案

答案真的在于直接赋值的方式,比如b=ab=7工作。 b=a创建对同样由 a 引用的对象的新引用, 并将该新引用与名称 b 相关联.后续b=7然后删除附加到名称 b 的引用, 并与名称 b 建立不同的关联.这将是真实的a是不可变类型(如整数)或可变类型(如 numpy 数组)。在这两种情况下,a 的内容都不会进行修改。

相比之下,image2[image < minval] = minval不是重新分配。通过使用 []它调用对象 __setitem__ 的方法( image2 ) .此方法更改了部分基础数据结构,而无需将任何内容重新分配给 image2 .

Python 最基本的类型是“不可变的”。这意味着您什么都无法更改它们(例如,如果 image2 是不可变类型 tuple ,尝试使用 [] 索引更改其元素之一会导致异常有待提高)。

因此,非常非常松散,如果您习惯了 C/C++ 的思维方式,有时将不可变类型视为按值传递而可变类型则可能会有所帮助查看函数或方法原型(prototype)时的引用。但是,正如评论中所指出的那样,这并不是真正发生的事情:一切都是引用,但某些引用(不可变类型)会自动按照 C/C++ 处理 const 的方式进行处理。引用资料。

不可变类型包括:

  • 基本数字类型:bool , int , long , floatcomplex
  • 基本字符串类型:str , unicode (仅限 python 2.x)和 bytes (仅限 Python 3.x)
  • tuple (但不是 list )

关于python - 为什么我需要 np.array() 或 np.copy()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27538174/

相关文章:

python - 使用 cython 加速 numpy 数组的类(class)速度

python - pandas - 通过重复值连接列

python - 从多个列表读取到 Pandas Dataframe 中

python - 如何使用 Sphinx 的 autodoc 来记录类的 __init__(self) 方法?

python - 如何从 Pandas 数据框中的不同点选择行

numpy - np.zeros(dim,1) 给出不理解的数据类型

python - Keras 中的 Tensorflow adam 优化器

python - 我有一个数字素因数的 Python 列表。我如何(以 Python 方式)找到所有因素?

python:不支持 OpenCV 图像深度 (CV_64F)

python - numpy 中是否有 x2fx 的等效函数?