2015-03-24 20 views
4

因此,與numpy的陣列分配一個到另一個只是複製參考: 即NumPy的分配切片,當數組複製的

import numpy as np 
x = np.array([5,8]) 
y = x 
y += 1 
x 
Out: array([6, 9]) 

如果我想有一個深拷貝,然後我應該使用x.copy()。從高維數組中觀看時也是如此,例如,

A=np.array([[4,10],[8,1]]) 
b=A[:,1] 
b+=1 
A 
Out: array([[ 4, 11], 
      [ 8, 2]]) 

而反過來(從上面繼續):

A[:,1]=b 
b 
Out: array([11, 2]) 
b+=1 
A 
Out: array([[ 4, 12], 
      [ 8, 3]]) 

所以到這裏的一切工作始終。但現在如果我繼續和做:

A[:,0] = b 
A 
Out: array([[12, 12], 
      [ 3, 3]]) 
b 
Out: array([12, 3]) 
b+=1 
A 
Out: array([[12, 13], 
      [ 3, 4]]) 

我不明白的是,爲什麼第一列保持不變,其他不是?爲什麼第二列繼續指向b數組?是否有任何規則來決定何時在賦值時深度複製數組?

+0

我不知道python,但它看起來像C++指針。您可以將1個內存空間分配給多個變量(如許多變量讀取相同的內存指針),而不是1個變量分配給多個內存空間(1個var讀取多個內存指針) – Vuwox 2015-03-24 23:17:39

回答

3

當你正在做

b=A[:,1] 

它正在創建底層數組的引用。 但在這種情況下

A[:,0] = b 

值只有copied.As在最後的陳述,而目前仍在由b變爲引用第二列第一列保持不變的結果。 Take a look at this

+0

謝謝。 當我在 'A [:,1] = b'後面不會覆蓋這個參考嗎? 並感謝您的鏈接,但我發現 ' B [:] = A' 也作了參考,而不是一個單獨的副本。 – 2015-03-28 22:31:23