numpy切片和索引不同的结果

时间:2018-05-07 12:12:53

标签: python numpy sub-array

通过任何切片,掩蔽或花式索引操作获得的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中的错误,还是设计错误?如果是设计,那么这种不一致的证据是什么?

1 个答案:

答案 0 :(得分:2)

这不是一个错误。只要将切片对象传递给Numpy数组,返回的子数组就是原始项的视图,这意味着即使切片分配或单项分配也会更改原始数组。但在其他情况下,返回的结果不是视图。事实上,它是所选切片的浅视图(副本),它仅支持切片分配,就像Python支持的其他可变对象一样。

documentation中也提到了这一点:

  

[...]与索引数组一样,返回的是数据的副本,而不是切片所获得的视图。