【发布时间】:2018-10-17 05:54:00
【问题描述】:
在通过任何切片、掩码或花式索引操作获得的numpy子数组中,都只是原始数组的视图,可以证明如下:
$ python3
Python 3.5.2 (default, Nov 23 2017, 16:37:01)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> np.__version__
'1.11.0'
>>> a = np.arange(3); a[:2] = 111; a
array([111, 111, 2])
>>> a = np.arange(3); a[a<2] = 111; a
array([111, 111, 2])
>>> a = np.arange(3); a[[0,1]] = 111; a
array([111, 111, 2])
在上面的例子中,整个子数组被赋值。但是,如果我们分配给子数组的一个元素,切片操作的结果仍然表现为视图,而屏蔽和花式索引操作的结果表现为独立副本:
>>> a = np.arange(3); a[:2][0] = 111; a
array([111, 1, 2])
>>> a = np.arange(3); a[a<2][0] = 111; a
array([0, 1, 2])
>>> a = np.arange(3); a[[0,1]][0] = 111; a
array([0, 1, 2])
这是 numpy 中的错误,还是设计使然?如果是有意为之,那么这种不一致的依据是什么?
【问题讨论】: