逻辑寻址numpy与其他矩阵弄乱了

逻辑寻址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.

我刚刚发现了一个问题,我不知道是应该这样做,还是我做错了。当我在一个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.,  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.]))