python索引don';不要更改numpy数组

python索引don';不要更改numpy数组,python,numpy,Python,Numpy,输出为: import numpy as np a = np.array([[0, 1, 2], [0, 1, 2], [1, 1, 2]]) a[[0, 1]] = 100 # Changed print(a) a[[0, 1]][0, 0] = 98 # Not Changed print(a) a[0:2][0, 0] = 99 # Changed print(a) 那么为什么第二种方法没有改变a数组,而第一种方法和第三种方

输出为:

import numpy as np
a = np.array([[0, 1, 2],
              [0, 1, 2],
              [1, 1, 2]])

a[[0, 1]] = 100  # Changed
print(a)
a[[0, 1]][0, 0] = 98  # Not Changed
print(a)
a[0:2][0, 0] = 99  # Changed
print(a)
那么为什么第二种方法没有改变a数组,而第一种方法和第三种方法有效呢?我在谷歌上搜索了很多答案,但我还是不明白。这很复杂

基本上,您在案例1和案例2中所做的工作,以及在案例3中所做的基本索引工作。高级索引状态下的NumPy文档:

高级索引始终返回数据的副本(与返回视图的基本切片不同)

所以我们已经知道了案例2和案例3之间的区别。案例2基本上等同于

b=a[[0,1]]
b[0,0]=98
由于高级索引创建了一个副本,
b
不再链接到
a
,更改也不会反映出来。在案例3中,我们有

b=a[0:2]
b[0,0]=99
其中
b
现在是
a
(基本索引)的视图,因此
b
中的更改反映在
a

那么案例1中发生了什么? 本质区别在于,您不能将其拆分为赋值
b=…
和后续的
setitem
操作。相反,您直接对索引上的结果执行
setitem
,这不会创建副本(仅
getitem
对副本进行操作)。所以我们得到了与案例2中相同的行为

以下说明了这一点:

情况1相当于

setitem(a[0,1],100)#直接在
情况2相当于

setitem(
getitem(a[0,1]),这是一个副本
[0, 0],
98
)
# first
[[100 100 100]
[100 100 100]
[  1   1   2]]

# second
[[100 100 100]
[100 100 100]
[  1   1   2]]

# third
[[ 99 100 100]
[100 100 100]
[  1   1   2]]