[英]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.