簡體   English   中英

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

[英]Why do I need np.array() or np.copy()?

這是一個真正的numpy新手問題。

我有一個名為'image'的numpy數組。 這樣做:

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

...更改“圖片”的內容。

我收集的是因為Python中的變量確實是引用,所以'image2'只是引用'image'的另一種方式。 所以我應該使用“image2 = np.copy(image)”。 精細。

但是,那么,當我這樣做時,為什么不“改變”:

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不是重新分配。 通過使用[]它調用對象image2的方法( __setitem__ )。 此方法更改基礎數據結構的某些部分,而不將任何內容重新分配給image2

Python最基本的類型是“不可變的”。 這意味着您無法做任何事情都會改變它們(例如,如果image2屬於不可變類型tuple ,嘗試使用[]索引更改其中一個元素將導致引發異常)。

因此, 非常非常松散 ,如果您習慣於C / C ++思維模式,它有時可以幫助將不可變類型視為通過值傳遞,並且當您查看函數時通過引用傳遞可變類型或方法原型。 正如評論中指出的那樣,這並不是真正發生的事情:一切都是引用,但是一些引用(不可變類型)會按照C / C ++處理const引用的方式自動處理。

不可變類型包括:

  • 基本數字類型: boolintlongfloatcomplex
  • 基本字符串類型: strunicode (僅限python 2.x)和bytes (僅限python 3.x)
  • tuple (但不是list

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM