2011-10-31 70 views
4
import numpy as np 

a = np.zeros((3,2)) 
ind_row = np.array([0,1])  
a[ind_row, 1]=3 

现在,正在如预期anumpy:可以将值分配给子数组吗?

[[ 0. 3.] 
[ 0. 3.] 
[ 0. 0.]] 

我想分配一个值的a[ind_row, 1]子阵列,并且希望能够做到这一点,如下所示:

a[ind_row, 1][1] = 5 

但是,这使a不变!我为什么要期待这个?

回答

9

这里的问题是,advanced indexing创建数组的副本,只有副本被修改。 (这是相对于基本的索引,这导致的视图成原始数据。)

当使用

a[ind_row, 1][1] = 5 
时直接分配到一个先进的切片

a[ind_row, 1] = 3 

没有创建副本,但

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 

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

相关问题