[英]Why do I need to use np.array to not get the error 'list object has no attribute shape'?
[英]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=a
和b=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
引用的方式自動處理。
不可變類型包括:
bool
, int
, long
, float
和complex
str
, unicode
(僅限python 2.x)和bytes
(僅限python 3.x) tuple
(但不是list
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.