簡體   English   中英

對於numpy數組,賦值給array和array[:]有區別嗎?

[英]For a numpy array, is there a difference between assigning to array and array[:]?

這是一個我以前從未考慮過的非常基本和微妙的問題,但我最近再次偶然發現了符號a[:] ,這次它引起了我的注意。 考慮以下兩個示例:

例一

a     = numpy.zeros(10)
vals  = numpy.arange(10)
a     = vals**2

例子二

a     = numpy.zeros(10)
vals  = numpy.arange(10)
a[:]  = vals**2

不同之處僅在於最后一行的分配。 多年來,我從未想過兩者之間的區別。 但是有區別嗎? B 是否通過直接將值分配給現有數組而不是在示例 A 中創建另一個臨時數組來使用更少的 memory? 或者兩者到底是相同的(甚至在引擎蓋下)?

是的,不同之處在於a =更改與名稱a關聯的值,而a[:] =在內部改變a

在內部改變a[:]應該占用少一點 memory,因為a的原始值不需要在分配后單獨進行垃圾收集(因為不再有名稱指向它)。

這也代表支持切片分配的其他 Python 對象、collections 等(事實上,修改相同的 object 具有os.walk()中過濾目錄的重要用例)。

但是,您的用例可能最好只使用

a = numpy.arange(10)  # (or however you'd get the values to square)
a **= 2

因為 Numpy 可以優化__ipow__內聯電源操作以全部就地發生,並且在將其放置到位之前不會為vals ** 2進行額外分配。

第一個結果:

[ 0  1  4  9 16 25 36 49 64 81]

第二個結果:

[ 0.  1.  4.  9. 16. 25. 36. 49. 64. 81.]

那些看起來真的和你一模一樣嗎?

分配到現有數組中會保留其dtype 只分配給變量而不是讓你得到任何新值。

此外,如果您有另一個對原始數組的引用,即假設您已經完成了b = a ,那么您的第一個代碼根本不會影響b而您的第二個代碼會。

暫無
暫無

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

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