numpy:子数组是否可以不分配值?

4
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不变!为什么会这样呢?
1个回答

10
这里的问题在于高级索引会创建数组的副本,而只有副本被修改。(这与基本索引相反,基本索引会得到对原始数据的视图。)
当直接对高级切片进行赋值时,
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

更复杂的情况也可以用类似的方式重写。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接