逻辑寻址numpy与其他矩阵弄乱了
我刚刚发现了一个问题,我不知道是应该这样做,还是我做错了。当我在一个numpy矩阵中使用逻辑寻址来改变一个矩阵的所有值,比如说,等于1。与此矩阵相关的所有其他矩阵也将被修改逻辑寻址numpy与其他矩阵弄乱了,numpy,matrix,indexing,addressing,Numpy,Matrix,Indexing,Addressing,我刚刚发现了一个问题,我不知道是应该这样做,还是我做错了。当我在一个numpy矩阵中使用逻辑寻址来改变一个矩阵的所有值,比如说,等于1。与此矩阵相关的所有其他矩阵也将被修改 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.
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.]])
谁能告诉我我做错了什么?这是一个bug吗?这不是bug。在python中说
B=A
意味着B
和A
都指向同一个对象。你需要复制矩阵
>>将numpy作为np导入
>>>从numpy导入矩阵作为mtx
>>>A=mtx(np.眼(6))
>>>B=A.复制()
>>>C=A
#检查内存位置。
>>>身份证(A)
19608352
>>>id(C)
19608352#与
>>>身份证(B)
19607992#不同的对象
>>>A[A==1]=5
>>>B#B与a是不同的对象
矩阵([[1,0,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与A是同一个对象
矩阵([[5,0,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是一个视图,现在指向A的第一行
>>>身份证(A)
28088720
>>>id(B)#不同的对象!
28087568
#B仍然指向A的第一行的内存位置,但是通过numpy欺骗
>>>B
矩阵([[1,0,0,0,0,0,0.]))
>>>B*=5#就地乘法,更新与A的第一行相同的B
>>>A
矩阵([[5,0,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#将B*10分配给不同的内存块
>>>A
矩阵([[5,0,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
矩阵([[50,0,0,0,0,0,0.]))