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

时间:2014-12-18 02:13:35

标签: python numpy

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

我有一个名为'image'的numpy数组。这样做:

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

...更改'image'的内容。

我收集的是因为Python中的变量确实是引用,所以'image2'只是引用'image'的另一种方式。所以我应该使用“image2 = np.copy(image)”。细

但是,当我这样做时,为什么不“改变”:

a = 5
b = a
b = 7

不是'b'只是另一种引用'a'的方式吗?如果是这样,为什么在这个结尾没有a == 7?

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

1 个答案:

答案 0 :(得分:4)

答案实际上在于直接分配的方式,例如b=ab=7b=a创建对a引用的对象的新引用,并将该新引用与名称b相关联。随后的b=7然后删除附加到名称b的引用,并与名称b建立不同的关联。无论a是不可变类型(如整数)还是可变类型(如numpy数组),都是如此。在任何情况下都不会修改a的内容。

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

Python最基本的类型是&#34; immutable&#34;。这意味着您可以执行的 nothing 将更改它们(例如,如果image2属于不可变类型tuple,则尝试使用{{1}更改其中一个元素索引会导致异常被引发。)

因此,非常非常松散,如果你习惯于C / C ++思维模式,它有时可以帮助将不可变类型视为通过值和可变类型传递当您查看函数或方法原型时,通过引用传递。正如评论中指出的那样,这并不是真正发生的事情:一切都是引用,但是一些引用(不可变类型)会自动处理C / C ++处理[]引用的方式。

不可变类型包括:

  • 基本数字类型:constboolintlongfloat
  • 基本字符串类型:complexstr(仅限python 2.x)和unicode(仅限python 3.x)
  • bytes(但不是tuple