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
不变!为什么会这样呢?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
更复杂的情况也可以用类似的方式重写。