2011-10-31 91 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 

更復雜的情況下也可以以類似的方式重寫。