错误还是特性:使用切片克隆numpy数组
接着David Morrissey在“如何在Python中克隆一个列表?”的回答,我在做一些性能测试时,发现了使用numpy数组时的一些意外情况。我知道numpy数组可以/应该通过
clone = numpy.array(original)
或者
clone = numpy.copy(original)
来克隆,但我错误地认为切片也能做到这一点。然而:
In [11]: original = numpy.arange(4)
In [12]: original
Out[12]: array([0, 1, 2, 3])
In [13]: clone = original[:]
In [14]: clone
Out[14]: array([0, 1, 2, 3])
In [15]: clone[0] = 1
In [16]: clone
Out[16]: array([1, 1, 2, 3])
In [17]: original
Out[17]: array([1, 1, 2, 3])
这是否有合理的原因导致这种小小的不一致,还是我应该报告一个bug呢?
1 个回答
11
在numpy中,切片其实是对原始数组的引用或者说是“视图”,而不是复制。这是故意这样设计的,并不是一个错误。原因是,视图比复制更有用。