numpy:可以将值分配给子数组吗?

时间:2011-10-31 22:52:20

标签: python arrays numpy

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 个答案:

答案 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

更复杂的案例也可以用类似的方式重写。