繁体   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