import numpy as np
a = np.zeros((3,2))
ind_row = np.array([0,1])
a[ind_row, 1]=3
现在,a
正如所料:
[[ 0. 3.]
[ 0. 3.]
[ 0. 0.]]
我想为a[ind_row, 1]
的子数组赋值,并希望能够按如下方式执行此操作:
a[ind_row, 1][1] = 5
然而,这使a
保持不变!我为什么要这么想?
答案 0 :(得分:10)
这里的问题是advanced indexing创建了数组的副本,并且只修改了副本。 (这与基本索引形成对比,后者导致查看原始数据。)
直接分配给高级切片时
a[ind_row, 1] = 3
没有创建副本,但使用
时a[ind_row, 1][1] = 5
a[ind_row, 1]
部分创建副本,[1]
部分索引到此临时副本。副本确实已更改,但由于您没有对其进行任何引用,因此您无法看到更改,并且会立即进行垃圾回收。
这类似于切片标准Python列表(也创建副本):
>>> a = range(5)
>>> a[2:4] = -1, -2
>>> a
[0, 1, -1, -2, 4]
>>> a[2:4][1] = -3
>>> a
[0, 1, -1, -2, 4]
这个简单案例的解决方案显然是
a[ind_row[1], 1] = 5
更复杂的案例也可以用类似的方式重写。