2015-03-24 19 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