2016-11-08 63 views
0

我對np 2D數組中的元素值更改有疑問。在這裏,我有例如:python np數組更改for循環中的元素值

a=np.arange(10).reshape(2,5) 
for i in a: # go through the rows of array 
    i=np.array([0,0,0,0,0]) 

print a 

返回值是

array([[0, 1, 2, 3, 4], 
     [5, 6, 7, 8, 9]]) 

這意味着有與原始陣列沒有變化。這是否意味着for循環中的i是數組a的每一行的副本?如果我是副本,那麼它是有道理的,因爲副本的更改不會影響原始值。但我嘗試下面的代碼:

a=np.arange(10).reshape(2,5) 
for i in a: # go through the rows of array 
    i[:]=np.array([0,0,0,0,0]) 

print a 

返回結果是

array([[0, 0, 0, 0, 0], 
     0, 0, 0, 0, 0]]) 

所以我don'y明白我爲什麼[:]可以在這裏工作,如果我是複製。如果這個問題重複,請提供鏈接? 謝謝。

回答

0

i不是副本。請記住,for循環會根據迭代中的項目到目標列表(位於in的左側)進行重複分配。因此,在每次迭代中,i持有對子陣列a中的引用。

這裏:

for i in a: 
    i = np.array([0,0,0,0,0]) 

您在a每個子陣列分配到的名稱i隨後馬上將名稱分配到一個完全無關的對象。在該循環中嘗試i = 'unrelated',並注意除了將i分配給新的字符串對象之外,它沒有任何效果(我的意思是a)。

第二種情況中a子陣列分配給i連續(如第一種情況),但之後進行經由參考i一個到位修飾。 更清楚,第二種情況下的第一次迭代是一樣的:

i = a[0] 
i[:] = np.array([0,0,0,0,0]) 

及第二遞歸:

i = a[1] 
i[:] = np.array([0,0,0,0,0]) 

還要注意如何在從第一到第二次迭代的過渡i = a[1]不修改前面的參考a[0],而是將名稱i重新分配給新對象a[1]

+0

感謝您的回覆,_in place_ modification的含義是什麼?我同意我保留對a元素的引用,這意味着我和a具有相同的內存地址。如果我在for循環中指定'i = np.array([0,0,0,0,0])',這意味着i和np.array([0,0,0,0,0])具有相同的內存地址,然後我和一個沒有相同的內存地址。所以我的修改不會影響一個。是對的嗎? –

+0

正如你將'a [x] = 1'改變索引'x'的值一樣,你可以通過使用一個覆蓋列表'a'的切片來同樣地改變整個列表(就地表示相同的對象) [:] = [...]'。是的,我會說對的 –

相關問題