2013-10-10 60 views
1

我剛剛發現一個問題,我不知道這是否意味着這樣或我只是做錯了。當我在numpy矩陣中使用邏輯尋址來改變矩陣的所有值,例如等於1.所有其他與矩陣有某種關係的矩陣也將被修改。邏輯尋址numpy與其他矩陣混淆

In [1]: import numpy as np 
In [2]: from numpy import matrix as mtx 
In [3]: A=mtx(np.eye(6)) 
In [4]: A 
Out[4]: 
matrix([[ 1., 0., 0., 0., 0., 0.], 
     [ 0., 1., 0., 0., 0., 0.], 
     [ 0., 0., 1., 0., 0., 0.], 
     [ 0., 0., 0., 1., 0., 0.], 
     [ 0., 0., 0., 0., 1., 0.], 
     [ 0., 0., 0., 0., 0., 1.]]) 

In [5]: B=A 

In [6]: C=B 

In [7]: D=C 

In [8]: A[A==1]=5 

In [9]: A 
Out[9]: 
matrix([[ 5., 0., 0., 0., 0., 0.], 
     [ 0., 5., 0., 0., 0., 0.], 
     [ 0., 0., 5., 0., 0., 0.], 
     [ 0., 0., 0., 5., 0., 0.], 
     [ 0., 0., 0., 0., 5., 0.], 
     [ 0., 0., 0., 0., 0., 5.]]) 

In [10]: B 
Out[10]: 
matrix([[ 5., 0., 0., 0., 0., 0.], 
     [ 0., 5., 0., 0., 0., 0.], 
     [ 0., 0., 5., 0., 0., 0.], 
     [ 0., 0., 0., 5., 0., 0.], 
     [ 0., 0., 0., 0., 5., 0.], 
     [ 0., 0., 0., 0., 0., 5.]]) 

In [11]: C 
Out[11]: 
matrix([[ 5., 0., 0., 0., 0., 0.], 
     [ 0., 5., 0., 0., 0., 0.], 
     [ 0., 0., 5., 0., 0., 0.], 
     [ 0., 0., 0., 5., 0., 0.], 
     [ 0., 0., 0., 0., 5., 0.], 
     [ 0., 0., 0., 0., 0., 5.]]) 

In [12]: D 
Out[12]: 
matrix([[ 5., 0., 0., 0., 0., 0.], 
     [ 0., 5., 0., 0., 0., 0.], 
     [ 0., 0., 5., 0., 0., 0.], 
     [ 0., 0., 0., 5., 0., 0.], 
     [ 0., 0., 0., 0., 5., 0.], 
     [ 0., 0., 0., 0., 0., 5.]]) 

有誰能告訴我我做錯了什麼?這是一個錯誤?

回答

3

這不是一個錯誤。在Python中說B=A意味着BA都指向同一個對象。你需要複製矩陣。

>>> import numpy as np 
>>> from numpy import matrix as mtx 
>>> A = mtx(np.eye(6)) 
>>> B = A.copy() 
>>> C = A 

#Check memory locations. 
>>> id(A) 
19608352 
>>> id(C) 
19608352 #Same object as A 
>>> id(B) 
19607992 #Different object then A 

>>> A[A==1] = 5 
>>> B #B is a different object then A 
matrix([[ 1., 0., 0., 0., 0., 0.], 
     [ 0., 1., 0., 0., 0., 0.], 
     [ 0., 0., 1., 0., 0., 0.], 
     [ 0., 0., 0., 1., 0., 0.], 
     [ 0., 0., 0., 0., 1., 0.], 
     [ 0., 0., 0., 0., 0., 1.]]) 

>>> C #C is the same object as A 
matrix([[ 5., 0., 0., 0., 0., 0.], 
     [ 0., 5., 0., 0., 0., 0.], 
     [ 0., 0., 5., 0., 0., 0.], 
     [ 0., 0., 0., 5., 0., 0.], 
     [ 0., 0., 0., 0., 5., 0.], 
     [ 0., 0., 0., 0., 0., 5.]]) 

同樣的問題可以看出,用Python列表:

>>> A = [5,3] 
>>> B = A 
>>> B[0] = 10 
>>> A 
[10, 3] 

注意,這是不同然後返回一個numpy的視圖,在這種情況下:

>>> A = mtx(np.eye(6)) 
>>> B = A[0] #B is a view and now points to the first row of A 

>>> id(A) 
28088720 
>>> id(B) #Different objects! 
28087568 
#B still points to the memory location of A's first row, but through numpy trickery 

>>> B 
matrix([[ 1., 0., 0., 0., 0., 0.]]) 
>>> B *= 5 #In place multiplication, updates B which is the same as A's first row 
>>> A 
matrix([[ 5., 0., 0., 0., 0., 0.], 
     [ 0., 1., 0., 0., 0., 0.], 
     [ 0., 0., 1., 0., 0., 0.], 
     [ 0., 0., 0., 1., 0., 0.], 
     [ 0., 0., 0., 0., 1., 0.], 
     [ 0., 0., 0., 0., 0., 1.]]) 

如查看B指向A的第一行,A已更改。現在讓我們強制一個副本。

>>> B = B*10 #Assigns B*10 to a different chunk of memory 
>>> A 
matrix([[ 5., 0., 0., 0., 0., 0.], 
     [ 0., 1., 0., 0., 0., 0.], 
     [ 0., 0., 1., 0., 0., 0.], 
     [ 0., 0., 0., 1., 0., 0.], 
     [ 0., 0., 0., 0., 1., 0.], 
     [ 0., 0., 0., 0., 0., 1.]]) 
>>> B 
matrix([[ 50., 0., 0., 0., 0., 0.]])