Python numpy切片和索引不同的结果

Python numpy切片和索引不同的结果,python,numpy,sub-array,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 >>>

在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])
$python3
Python 3.5.2(默认值,2017年11月23日,16:37:01)
[GCC 5.4.0 20160609]在linux上
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>将numpy作为np导入
>>>np.\u版本__
'1.11.0'
>>>a=np.arange(3);a[:2]=111;A.
数组([111,111,2])
>>>a=np.arange(3);a[a>>a=np.arange(3);a[[0,1]]=111;a
数组([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])
a=np.arange(3);a[:2][0]=111;a 数组([111,1,2]) >>>a=np.arange(3);a[a>>a=np.arange(3);a[[0,1]][0]=111;a 数组([0,1,2])
这是numpy中的一个bug,还是设计的bug?如果是设计的,那么这种不一致性的证据是什么?

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

在以下章节中也提到了这一点:

[…]与索引数组一样,返回的是数据的副本,而不是使用切片时得到的视图


好的,这意味着我还不太清楚赋值在Python中是如何工作的。现在我的第一印象是,
a[I]
根据它是否出现在赋值运算符的左侧而进行不同的计算。重新阅读文档,我发现对于用户定义的对象,赋值
object[expr]=…
通过计算,而在其他上下文中使用。@Leon确实如此。这就是在Python中设置项和获取项的工作方式。