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